From 77d01f4ef1c383ff395ff513b7977bbb3dd534b6 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Mon, 13 Apr 2026 07:45:23 +0000 Subject: [PATCH 01/18] Implement google_cloud_pubsub package with gRPC and resolve protobuf issues --- .../google_cloud_pubsub/analysis_options.yaml | 5 + .../lib/google_cloud_pubsub.dart | 18 + pkgs/google_cloud_pubsub/lib/src/client.dart | 243 + .../google/protobuf/duration.pb.dart | 179 + .../google/protobuf/duration.pbenum.dart | 10 + .../google/protobuf/duration.pbjson.dart | 28 + .../generated/google/protobuf/empty.pb.dart | 61 + .../google/protobuf/empty.pbenum.dart | 10 + .../google/protobuf/empty.pbjson.dart | 23 + .../google/protobuf/field_mask.pb.dart | 268 + .../google/protobuf/field_mask.pbenum.dart | 10 + .../google/protobuf/field_mask.pbjson.dart | 26 + .../generated/google/protobuf/struct.pb.dart | 337 + .../google/protobuf/struct.pbenum.dart | 42 + .../google/protobuf/struct.pbjson.dart | 134 + .../google/protobuf/timestamp.pb.dart | 203 + .../google/protobuf/timestamp.pbenum.dart | 10 + .../google/protobuf/timestamp.pbjson.dart | 28 + .../generated/google/pubsub/v1/pubsub.pb.dart | 9371 +++++++++++++++++ .../google/pubsub/v1/pubsub.pbenum.dart | 610 ++ .../google/pubsub/v1/pubsub.pbgrpc.dart | 837 ++ .../google/pubsub/v1/pubsub.pbjson.dart | 3139 ++++++ .../generated/google/pubsub/v1/schema.pb.dart | 1383 +++ .../google/pubsub/v1/schema.pbenum.dart | 99 + .../google/pubsub/v1/schema.pbgrpc.dart | 321 + .../google/pubsub/v1/schema.pbjson.dart | 389 + pkgs/google_cloud_pubsub/lib/src/message.dart | 46 + .../lib/src/pubsub_emulator_host_vm.dart | 88 + .../lib/src/pubsub_emulator_host_web.dart | 27 + .../lib/src/subscription.dart | 48 + pkgs/google_cloud_pubsub/lib/src/topic.dart | 41 + pkgs/google_cloud_pubsub/pubspec.yaml | 26 + .../google_cloud_pubsub/test/client_test.dart | 28 + .../test/integration_test.dart | 40 + pubspec.yaml | 1 + 35 files changed, 18129 insertions(+) create mode 100644 pkgs/google_cloud_pubsub/analysis_options.yaml create mode 100644 pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/client.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pb.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbenum.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbjson.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pb.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbenum.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbjson.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pb.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbenum.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbjson.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pb.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbenum.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbjson.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pb.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbenum.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbjson.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pb.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbenum.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbjson.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pb.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbenum.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbgrpc.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbjson.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/message.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_web.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/subscription.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/topic.dart create mode 100644 pkgs/google_cloud_pubsub/pubspec.yaml create mode 100644 pkgs/google_cloud_pubsub/test/client_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/integration_test.dart diff --git a/pkgs/google_cloud_pubsub/analysis_options.yaml b/pkgs/google_cloud_pubsub/analysis_options.yaml new file mode 100644 index 00000000..a03b6439 --- /dev/null +++ b/pkgs/google_cloud_pubsub/analysis_options.yaml @@ -0,0 +1,5 @@ +include: ../../analysis_options.yaml + +analyzer: + exclude: + - lib/src/generated/** diff --git a/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart b/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart new file mode 100644 index 00000000..500a6593 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart @@ -0,0 +1,18 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export 'src/client.dart' show PubSub; +export 'src/message.dart' show Message, ReceivedMessage; +export 'src/subscription.dart' show Subscription; +export 'src/topic.dart' show Topic; diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart new file mode 100644 index 00000000..e9e59c1c --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -0,0 +1,243 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:grpc/grpc.dart'; +import '../google_cloud_pubsub.dart'; +import 'generated/google/pubsub/v1/pubsub.pbgrpc.dart' as grpc; +import 'pubsub_emulator_host_web.dart' + if (dart.library.io) 'pubsub_emulator_host_vm.dart'; +import 'subscription.dart' show newSubscription; +import 'topic.dart' show newTopic; + +/// API for flexible, reliable, large-scale messaging. +/// +/// See [Google Cloud Pub/Sub](https://cloud.google.com/pubsub). +final class PubSub { + final FutureOr _projectId; + final ClientChannel _channel; + grpc.PublisherClient? _publisherClient; + grpc.SubscriberClient? _subscriberClient; + + Future get _requiredProjectId async { + final id = await _projectId; + if (id == noProject) { + throw StateError('a project ID is required'); + } + return id; + } + + static const String noProject = ''; + + static FutureOr _calculateProjectId( + String? projectId, + String? emulatorHost, + ) => switch ((projectId, emulatorHost)) { + (final String projectId, _) => projectId, + (null, _?) => '', + (null, null) => projectFromEnvironment ?? 'unknown-project', + }; + + static ClientChannel _calculateChannel( + String? apiEndpoint, + String? emulatorHost, + ) { + if (apiEndpoint != null) { + return ClientChannel( + apiEndpoint, + options: const ChannelOptions(credentials: ChannelCredentials.secure()), + ); + } + + if (emulatorHost case String host) { + var cleanHost = host; + var port = 8085; + if (host.contains(':')) { + final parts = host.split(':'); + cleanHost = parts[0]; + port = int.parse(parts[1]); + } + return ClientChannel( + cleanHost, + port: port, + options: const ChannelOptions( + credentials: ChannelCredentials.insecure(), + ), + ); + } + + return ClientChannel( + 'pubsub.googleapis.com', + options: const ChannelOptions(credentials: ChannelCredentials.secure()), + ); + } + + PubSub._(this._projectId, this._channel); + + /// Constructs a client used to communicate with [Google Cloud Pub/Sub][]. + factory PubSub({String? projectId, String? apiEndpoint}) { + final emulatorHost = pubsubEmulatorHost; + return PubSub._( + _calculateProjectId(projectId, emulatorHost), + _calculateChannel(apiEndpoint, emulatorHost), + ); + } + + grpc.PublisherClient get _publisher => + _publisherClient ??= grpc.PublisherClient(_channel); + grpc.SubscriberClient get _subscriber => + _subscriberClient ??= grpc.SubscriberClient(_channel); + + /// Closes the client and cleans up any resources associated with it. + Future close() async { + await _channel.shutdown(); + } + + // Topic-related methods + + /// A [Topic] object with the given [name]. + Topic topic(String name) => newTopic(this, name); + + /// A [Subscription] object with the given [name]. + Subscription subscription(String name) => newSubscription(this, name); + + /// Creates a new topic. + Future createTopic(String name) async { + final projectId = await _requiredProjectId; + final topicName = 'projects/$projectId/topics/$name'; + final topic = grpc.Topic()..name = topicName; + await _publisher.createTopic(topic); + return this.topic(name); + } + + /// Deletes a topic. + Future deleteTopic(String name) async { + final projectId = await _requiredProjectId; + final topicName = 'projects/$projectId/topics/$name'; + final request = grpc.DeleteTopicRequest()..topic = topicName; + await _publisher.deleteTopic(request); + } + + /// Publishes a message to a topic. + Future publish( + String topicName, + List data, { + Map? attributes, + }) async { + final projectId = await _requiredProjectId; + final fullTopicName = 'projects/$projectId/topics/$topicName'; + + final message = grpc.PubsubMessage()..data = data; + if (attributes != null) { + message.attributes.addAll(attributes); + } + + final request = grpc.PublishRequest() + ..topic = fullTopicName + ..messages.add(message); + + final response = await _publisher.publish(request); + return response.messageIds.first; + } + + // Subscription-related methods + + /// Creates a new subscription. + Future createSubscription( + String name, { + required String topic, + }) async { + final projectId = await _requiredProjectId; + final subscriptionName = 'projects/$projectId/subscriptions/$name'; + final topicName = 'projects/$projectId/topics/$topic'; + + final subscription = grpc.Subscription() + ..name = subscriptionName + ..topic = topicName; + + await _subscriber.createSubscription(subscription); + return this.subscription(name); + } + + /// Deletes a subscription. + Future deleteSubscription(String name) async { + final projectId = await _requiredProjectId; + final subscriptionName = 'projects/$projectId/subscriptions/$name'; + final request = grpc.DeleteSubscriptionRequest() + ..subscription = subscriptionName; + await _subscriber.deleteSubscription(request); + } + + /// Pulls messages from a subscription. + Future> pull( + String subscriptionName, { + int maxMessages = 1, + }) async { + final projectId = await _requiredProjectId; + final fullSubscriptionName = + 'projects/$projectId/subscriptions/$subscriptionName'; + + final request = grpc.PullRequest() + ..subscription = fullSubscriptionName + ..maxMessages = maxMessages; + + final response = await _subscriber.pull(request); + + return response.receivedMessages + .map( + (m) => ReceivedMessage( + ackId: m.ackId, + message: Message( + data: m.message.data, + attributes: m.message.attributes, + messageId: m.message.messageId, + publishTime: m.message.publishTime.toDateTime(), + ), + ), + ) + .toList(); + } + + /// Acknowledges messages. + Future acknowledge(String subscriptionName, List ackIds) async { + final projectId = await _requiredProjectId; + final fullSubscriptionName = + 'projects/$projectId/subscriptions/$subscriptionName'; + + final request = grpc.AcknowledgeRequest() + ..subscription = fullSubscriptionName + ..ackIds.addAll(ackIds); + + await _subscriber.acknowledge(request); + } + + /// Modifies the ack deadline for messages. + Future modifyAckDeadline( + String subscriptionName, + List ackIds, + int ackDeadlineSeconds, + ) async { + final projectId = await _requiredProjectId; + final fullSubscriptionName = + 'projects/$projectId/subscriptions/$subscriptionName'; + + final request = grpc.ModifyAckDeadlineRequest() + ..subscription = fullSubscriptionName + ..ackIds.addAll(ackIds) + ..ackDeadlineSeconds = ackDeadlineSeconds; + + await _subscriber.modifyAckDeadline(request); + } +} diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pb.dart new file mode 100644 index 00000000..3c50c8e3 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pb.dart @@ -0,0 +1,179 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/duration.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; +import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +/// A Duration represents a signed, fixed-length span of time represented +/// as a count of seconds and fractions of seconds at nanosecond +/// resolution. It is independent of any calendar and concepts like "day" +/// or "month". It is related to Timestamp in that the difference between +/// two Timestamp values is a Duration and it can be added or subtracted +/// from a Timestamp. Range is approximately +-10,000 years. +/// +/// # Examples +/// +/// Example 1: Compute Duration from two Timestamps in pseudo code. +/// +/// Timestamp start = ...; +/// Timestamp end = ...; +/// Duration duration = ...; +/// +/// duration.seconds = end.seconds - start.seconds; +/// duration.nanos = end.nanos - start.nanos; +/// +/// if (duration.seconds < 0 && duration.nanos > 0) { +/// duration.seconds += 1; +/// duration.nanos -= 1000000000; +/// } else if (duration.seconds > 0 && duration.nanos < 0) { +/// duration.seconds -= 1; +/// duration.nanos += 1000000000; +/// } +/// +/// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +/// +/// Timestamp start = ...; +/// Duration duration = ...; +/// Timestamp end = ...; +/// +/// end.seconds = start.seconds + duration.seconds; +/// end.nanos = start.nanos + duration.nanos; +/// +/// if (end.nanos < 0) { +/// end.seconds -= 1; +/// end.nanos += 1000000000; +/// } else if (end.nanos >= 1000000000) { +/// end.seconds += 1; +/// end.nanos -= 1000000000; +/// } +/// +/// Example 3: Compute Duration from datetime.timedelta in Python. +/// +/// td = datetime.timedelta(days=3, minutes=10) +/// duration = Duration() +/// duration.FromTimedelta(td) +/// +/// # JSON Mapping +/// +/// In JSON format, the Duration type is encoded as a string rather than an +/// object, where the string ends in the suffix "s" (indicating seconds) and +/// is preceded by the number of seconds, with nanoseconds expressed as +/// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +/// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +/// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +/// microsecond should be expressed in JSON format as "3.000001s". +class Duration extends $pb.GeneratedMessage with $mixin.DurationMixin { + factory Duration({ + $fixnum.Int64? seconds, + $core.int? nanos, + }) { + final $result = create(); + if (seconds != null) { + $result.seconds = seconds; + } + if (nanos != null) { + $result.nanos = nanos; + } + return $result; + } + Duration._() : super(); + factory Duration.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Duration.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Duration', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), + createEmptyInstance: create, + toProto3Json: $mixin.DurationMixin.toProto3JsonHelper, + fromProto3Json: $mixin.DurationMixin.fromProto3JsonHelper) + ..aInt64(1, _omitFieldNames ? '' : 'seconds') + ..a<$core.int>(2, _omitFieldNames ? '' : 'nanos', $pb.PbFieldType.O3) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Duration clone() => Duration()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Duration copyWith(void Function(Duration) updates) => + super.copyWith((message) => updates(message as Duration)) as Duration; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Duration create() => Duration._(); + Duration createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Duration getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Duration? _defaultInstance; + + /// Signed seconds of the span of time. Must be from -315,576,000,000 + /// to +315,576,000,000 inclusive. Note: these bounds are computed from: + /// 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + @$pb.TagNumber(1) + $fixnum.Int64 get seconds => $_getI64(0); + @$pb.TagNumber(1) + set seconds($fixnum.Int64 v) { + $_setInt64(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSeconds() => $_has(0); + @$pb.TagNumber(1) + void clearSeconds() => $_clearField(1); + + /// Signed fractions of a second at nanosecond resolution of the span + /// of time. Durations less than one second are represented with a 0 + /// `seconds` field and a positive or negative `nanos` field. For durations + /// of one second or more, a non-zero value for the `nanos` field must be + /// of the same sign as the `seconds` field. Must be from -999,999,999 + /// to +999,999,999 inclusive. + @$pb.TagNumber(2) + $core.int get nanos => $_getIZ(1); + @$pb.TagNumber(2) + set nanos($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNanos() => $_has(1); + @$pb.TagNumber(2) + void clearNanos() => $_clearField(2); + + /// Converts the [Duration] to [$core.Duration]. + /// + /// This is a lossy conversion, as [$core.Duration] is limited to [int] + /// microseconds and also does not support nanosecond precision. + $core.Duration toDart() => $core.Duration( + seconds: seconds.toInt(), + microseconds: nanos ~/ 1000, + ); + + /// Creates a new instance from [$core.Duration]. + static Duration fromDart($core.Duration duration) => Duration() + ..seconds = $fixnum.Int64(duration.inSeconds) + ..nanos = + (duration.inMicroseconds % $core.Duration.microsecondsPerSecond) * 1000; +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbenum.dart new file mode 100644 index 00000000..431da01d --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbenum.dart @@ -0,0 +1,10 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/duration.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbjson.dart new file mode 100644 index 00000000..247421db --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbjson.dart @@ -0,0 +1,28 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/duration.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use durationDescriptor instead') +const Duration$json = { + '1': 'Duration', + '2': [ + {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'}, + {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'}, + ], +}; + +/// Descriptor for `Duration`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List durationDescriptor = $convert.base64Decode( + 'CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW' + '5vcw=='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pb.dart new file mode 100644 index 00000000..b81dae8a --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pb.dart @@ -0,0 +1,61 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/empty.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +/// A generic empty message that you can re-use to avoid defining duplicated +/// empty messages in your APIs. A typical example is to use it as the request +/// or the response type of an API method. For instance: +/// +/// service Foo { +/// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +/// } +class Empty extends $pb.GeneratedMessage { + factory Empty() => create(); + Empty._() : super(); + factory Empty.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Empty.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Empty', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Empty clone() => Empty()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Empty copyWith(void Function(Empty) updates) => + super.copyWith((message) => updates(message as Empty)) as Empty; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Empty create() => Empty._(); + Empty createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Empty getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Empty? _defaultInstance; +} + +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbenum.dart new file mode 100644 index 00000000..dfb634ba --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbenum.dart @@ -0,0 +1,10 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/empty.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbjson.dart new file mode 100644 index 00000000..9a264728 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbjson.dart @@ -0,0 +1,23 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/empty.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use emptyDescriptor instead') +const Empty$json = { + '1': 'Empty', +}; + +/// Descriptor for `Empty`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List emptyDescriptor = + $convert.base64Decode('CgVFbXB0eQ=='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pb.dart new file mode 100644 index 00000000..1771e286 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pb.dart @@ -0,0 +1,268 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/field_mask.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; +import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +/// `FieldMask` represents a set of symbolic field paths, for example: +/// +/// paths: "f.a" +/// paths: "f.b.d" +/// +/// Here `f` represents a field in some root message, `a` and `b` +/// fields in the message found in `f`, and `d` a field found in the +/// message in `f.b`. +/// +/// Field masks are used to specify a subset of fields that should be +/// returned by a get operation or modified by an update operation. +/// Field masks also have a custom JSON encoding (see below). +/// +/// # Field Masks in Projections +/// +/// When used in the context of a projection, a response message or +/// sub-message is filtered by the API to only contain those fields as +/// specified in the mask. For example, if the mask in the previous +/// example is applied to a response message as follows: +/// +/// f { +/// a : 22 +/// b { +/// d : 1 +/// x : 2 +/// } +/// y : 13 +/// } +/// z: 8 +/// +/// The result will not contain specific values for fields x,y and z +/// (their value will be set to the default, and omitted in proto text +/// output): +/// +/// +/// f { +/// a : 22 +/// b { +/// d : 1 +/// } +/// } +/// +/// A repeated field is not allowed except at the last position of a +/// paths string. +/// +/// If a FieldMask object is not present in a get operation, the +/// operation applies to all fields (as if a FieldMask of all fields +/// had been specified). +/// +/// Note that a field mask does not necessarily apply to the +/// top-level response message. In case of a REST get operation, the +/// field mask applies directly to the response, but in case of a REST +/// list operation, the mask instead applies to each individual message +/// in the returned resource list. In case of a REST custom method, +/// other definitions may be used. Where the mask applies will be +/// clearly documented together with its declaration in the API. In +/// any case, the effect on the returned resource/resources is required +/// behavior for APIs. +/// +/// # Field Masks in Update Operations +/// +/// A field mask in update operations specifies which fields of the +/// targeted resource are going to be updated. The API is required +/// to only change the values of the fields as specified in the mask +/// and leave the others untouched. If a resource is passed in to +/// describe the updated values, the API ignores the values of all +/// fields not covered by the mask. +/// +/// If a repeated field is specified for an update operation, new values will +/// be appended to the existing repeated field in the target resource. Note that +/// a repeated field is only allowed in the last position of a `paths` string. +/// +/// If a sub-message is specified in the last position of the field mask for an +/// update operation, then new value will be merged into the existing sub-message +/// in the target resource. +/// +/// For example, given the target message: +/// +/// f { +/// b { +/// d: 1 +/// x: 2 +/// } +/// c: [1] +/// } +/// +/// And an update message: +/// +/// f { +/// b { +/// d: 10 +/// } +/// c: [2] +/// } +/// +/// then if the field mask is: +/// +/// paths: ["f.b", "f.c"] +/// +/// then the result will be: +/// +/// f { +/// b { +/// d: 10 +/// x: 2 +/// } +/// c: [1, 2] +/// } +/// +/// An implementation may provide options to override this default behavior for +/// repeated and message fields. +/// +/// Note that libraries which implement FieldMask resolution have various +/// different behaviors in the face of empty masks or the special "*" mask. +/// When implementing a service you should confirm these cases have the +/// appropriate behavior in the underlying FieldMask library that you desire, +/// and you may need to special case those cases in your application code if +/// the underlying field mask library behavior differs from your intended +/// service semantics. +/// +/// Update methods implementing https://google.aip.dev/134 +/// - MUST support the special value * meaning "full replace" +/// - MUST treat an omitted field mask as "replace fields which are present". +/// +/// Other methods implementing https://google.aip.dev/157 +/// - SHOULD support the special value "*" to mean "get all". +/// - MUST treat an omitted field mask to mean "get all", unless otherwise +/// documented. +/// +/// ## Considerations for HTTP REST +/// +/// The HTTP kind of an update operation which uses a field mask must +/// be set to PATCH instead of PUT in order to satisfy HTTP semantics +/// (PUT must only be used for full updates). +/// +/// # JSON Encoding of Field Masks +/// +/// In JSON, a field mask is encoded as a single string where paths are +/// separated by a comma. Fields name in each path are converted +/// to/from lower-camel naming conventions. +/// +/// As an example, consider the following message declarations: +/// +/// message Profile { +/// User user = 1; +/// Photo photo = 2; +/// } +/// message User { +/// string display_name = 1; +/// string address = 2; +/// } +/// +/// In proto a field mask for `Profile` may look as such: +/// +/// mask { +/// paths: "user.display_name" +/// paths: "photo" +/// } +/// +/// In JSON, the same mask is represented as below: +/// +/// { +/// mask: "user.displayName,photo" +/// } +/// +/// # Field Masks and Oneof Fields +/// +/// Field masks treat fields in oneofs just as regular fields. Consider the +/// following message: +/// +/// message SampleMessage { +/// oneof test_oneof { +/// string name = 4; +/// SubMessage sub_message = 9; +/// } +/// } +/// +/// The field mask can be: +/// +/// mask { +/// paths: "name" +/// } +/// +/// Or: +/// +/// mask { +/// paths: "sub_message" +/// } +/// +/// Note that oneof type names ("test_oneof" in this case) cannot be used in +/// paths. +/// +/// ## Field Mask Verification +/// +/// The implementation of any API method which has a FieldMask type field in the +/// request should verify the included field paths, and return an +/// `INVALID_ARGUMENT` error if any path is unmappable. +class FieldMask extends $pb.GeneratedMessage with $mixin.FieldMaskMixin { + factory FieldMask({ + $core.Iterable<$core.String>? paths, + }) { + final $result = create(); + if (paths != null) { + $result.paths.addAll(paths); + } + return $result; + } + FieldMask._() : super(); + factory FieldMask.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory FieldMask.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'FieldMask', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), + createEmptyInstance: create, + toProto3Json: $mixin.FieldMaskMixin.toProto3JsonHelper, + fromProto3Json: $mixin.FieldMaskMixin.fromProto3JsonHelper) + ..pPS(1, _omitFieldNames ? '' : 'paths') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + FieldMask clone() => FieldMask()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + FieldMask copyWith(void Function(FieldMask) updates) => + super.copyWith((message) => updates(message as FieldMask)) as FieldMask; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static FieldMask create() => FieldMask._(); + FieldMask createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static FieldMask getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static FieldMask? _defaultInstance; + + /// The set of field mask paths. + @$pb.TagNumber(1) + $pb.PbList<$core.String> get paths => $_getList(0); +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbenum.dart new file mode 100644 index 00000000..c357b68b --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbenum.dart @@ -0,0 +1,10 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/field_mask.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbjson.dart new file mode 100644 index 00000000..311d2c1a --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbjson.dart @@ -0,0 +1,26 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/field_mask.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use fieldMaskDescriptor instead') +const FieldMask$json = { + '1': 'FieldMask', + '2': [ + {'1': 'paths', '3': 1, '4': 3, '5': 9, '10': 'paths'}, + ], +}; + +/// Descriptor for `FieldMask`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List fieldMaskDescriptor = + $convert.base64Decode('CglGaWVsZE1hc2sSFAoFcGF0aHMYASADKAlSBXBhdGhz'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pb.dart new file mode 100644 index 00000000..63112a6a --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pb.dart @@ -0,0 +1,337 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/struct.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; +import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin; + +import 'struct.pbenum.dart'; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +export 'struct.pbenum.dart'; + +/// Represents a JSON object. +/// +/// An unordered key-value map, intending to perfectly capture the semantics of a +/// JSON object. This enables parsing any arbitrary JSON payload as a message +/// field in ProtoJSON format. +/// +/// This follows RFC 8259 guidelines for interoperable JSON: notably this type +/// cannot represent large Int64 values or `NaN`/`Infinity` numbers, +/// since the JSON format generally does not support those values in its number +/// type. +/// +/// If you do not intend to parse arbitrary JSON into your message, a custom +/// typed message should be preferred instead of using this type. +class Struct extends $pb.GeneratedMessage with $mixin.StructMixin { + factory Struct({ + $core.Iterable<$core.MapEntry<$core.String, Value>>? fields, + }) { + final $result = create(); + if (fields != null) { + $result.fields.addEntries(fields); + } + return $result; + } + Struct._() : super(); + factory Struct.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Struct.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Struct', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), + createEmptyInstance: create, + toProto3Json: $mixin.StructMixin.toProto3JsonHelper, + fromProto3Json: $mixin.StructMixin.fromProto3JsonHelper) + ..m<$core.String, Value>(1, _omitFieldNames ? '' : 'fields', + entryClassName: 'Struct.FieldsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OM, + valueCreator: Value.create, + valueDefaultOrMaker: Value.getDefault, + packageName: const $pb.PackageName('google.protobuf')) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Struct clone() => Struct()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Struct copyWith(void Function(Struct) updates) => + super.copyWith((message) => updates(message as Struct)) as Struct; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Struct create() => Struct._(); + Struct createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Struct getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Struct? _defaultInstance; + + /// Unordered map of dynamically typed values. + @$pb.TagNumber(1) + $pb.PbMap<$core.String, Value> get fields => $_getMap(0); +} + +enum Value_Kind { + nullValue, + numberValue, + stringValue, + boolValue, + structValue, + listValue, + notSet +} + +/// Represents a JSON value. +/// +/// `Value` represents a dynamically typed value which can be either +/// null, a number, a string, a boolean, a recursive struct value, or a +/// list of values. A producer of value is expected to set one of these +/// variants. Absence of any variant is an invalid state. +class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { + factory Value({ + NullValue? nullValue, + $core.double? numberValue, + $core.String? stringValue, + $core.bool? boolValue, + Struct? structValue, + ListValue? listValue, + }) { + final $result = create(); + if (nullValue != null) { + $result.nullValue = nullValue; + } + if (numberValue != null) { + $result.numberValue = numberValue; + } + if (stringValue != null) { + $result.stringValue = stringValue; + } + if (boolValue != null) { + $result.boolValue = boolValue; + } + if (structValue != null) { + $result.structValue = structValue; + } + if (listValue != null) { + $result.listValue = listValue; + } + return $result; + } + Value._() : super(); + factory Value.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Value.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, Value_Kind> _Value_KindByTag = { + 1: Value_Kind.nullValue, + 2: Value_Kind.numberValue, + 3: Value_Kind.stringValue, + 4: Value_Kind.boolValue, + 5: Value_Kind.structValue, + 6: Value_Kind.listValue, + 0: Value_Kind.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Value', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), + createEmptyInstance: create, + toProto3Json: $mixin.ValueMixin.toProto3JsonHelper, + fromProto3Json: $mixin.ValueMixin.fromProto3JsonHelper) + ..oo(0, [1, 2, 3, 4, 5, 6]) + ..e(1, _omitFieldNames ? '' : 'nullValue', $pb.PbFieldType.OE, + defaultOrMaker: NullValue.NULL_VALUE, + valueOf: NullValue.valueOf, + enumValues: NullValue.values) + ..a<$core.double>( + 2, _omitFieldNames ? '' : 'numberValue', $pb.PbFieldType.OD) + ..aOS(3, _omitFieldNames ? '' : 'stringValue') + ..aOB(4, _omitFieldNames ? '' : 'boolValue') + ..aOM(5, _omitFieldNames ? '' : 'structValue', + subBuilder: Struct.create) + ..aOM(6, _omitFieldNames ? '' : 'listValue', + subBuilder: ListValue.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Value clone() => Value()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Value copyWith(void Function(Value) updates) => + super.copyWith((message) => updates(message as Value)) as Value; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Value create() => Value._(); + Value createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Value getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Value? _defaultInstance; + + Value_Kind whichKind() => _Value_KindByTag[$_whichOneof(0)]!; + void clearKind() => $_clearField($_whichOneof(0)); + + /// Represents a JSON `null`. + @$pb.TagNumber(1) + NullValue get nullValue => $_getN(0); + @$pb.TagNumber(1) + set nullValue(NullValue v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasNullValue() => $_has(0); + @$pb.TagNumber(1) + void clearNullValue() => $_clearField(1); + + /// Represents a JSON number. Must not be `NaN`, `Infinity` or + /// `-Infinity`, since those are not supported in JSON. This also cannot + /// represent large Int64 values, since JSON format generally does not + /// support them in its number type. + @$pb.TagNumber(2) + $core.double get numberValue => $_getN(1); + @$pb.TagNumber(2) + set numberValue($core.double v) { + $_setDouble(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNumberValue() => $_has(1); + @$pb.TagNumber(2) + void clearNumberValue() => $_clearField(2); + + /// Represents a JSON string. + @$pb.TagNumber(3) + $core.String get stringValue => $_getSZ(2); + @$pb.TagNumber(3) + set stringValue($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasStringValue() => $_has(2); + @$pb.TagNumber(3) + void clearStringValue() => $_clearField(3); + + /// Represents a JSON boolean (`true` or `false` literal in JSON). + @$pb.TagNumber(4) + $core.bool get boolValue => $_getBF(3); + @$pb.TagNumber(4) + set boolValue($core.bool v) { + $_setBool(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasBoolValue() => $_has(3); + @$pb.TagNumber(4) + void clearBoolValue() => $_clearField(4); + + /// Represents a JSON object. + @$pb.TagNumber(5) + Struct get structValue => $_getN(4); + @$pb.TagNumber(5) + set structValue(Struct v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasStructValue() => $_has(4); + @$pb.TagNumber(5) + void clearStructValue() => $_clearField(5); + @$pb.TagNumber(5) + Struct ensureStructValue() => $_ensure(4); + + /// Represents a JSON array. + @$pb.TagNumber(6) + ListValue get listValue => $_getN(5); + @$pb.TagNumber(6) + set listValue(ListValue v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasListValue() => $_has(5); + @$pb.TagNumber(6) + void clearListValue() => $_clearField(6); + @$pb.TagNumber(6) + ListValue ensureListValue() => $_ensure(5); +} + +/// Represents a JSON array. +class ListValue extends $pb.GeneratedMessage with $mixin.ListValueMixin { + factory ListValue({ + $core.Iterable? values, + }) { + final $result = create(); + if (values != null) { + $result.values.addAll(values); + } + return $result; + } + ListValue._() : super(); + factory ListValue.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListValue.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListValue', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), + createEmptyInstance: create, + toProto3Json: $mixin.ListValueMixin.toProto3JsonHelper, + fromProto3Json: $mixin.ListValueMixin.fromProto3JsonHelper) + ..pc(1, _omitFieldNames ? '' : 'values', $pb.PbFieldType.PM, + subBuilder: Value.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListValue clone() => ListValue()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListValue copyWith(void Function(ListValue) updates) => + super.copyWith((message) => updates(message as ListValue)) as ListValue; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListValue create() => ListValue._(); + ListValue createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListValue getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ListValue? _defaultInstance; + + /// Repeated field of dynamically typed values. + @$pb.TagNumber(1) + $pb.PbList get values => $_getList(0); +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbenum.dart new file mode 100644 index 00000000..23027236 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbenum.dart @@ -0,0 +1,42 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/struct.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +/// Represents a JSON `null`. +/// +/// `NullValue` is a sentinel, using an enum with only one value to represent +/// the null value for the `Value` type union. +/// +/// A field of type `NullValue` with any value other than `0` is considered +/// invalid. Most ProtoJSON serializers will emit a Value with a `null_value` set +/// as a JSON `null` regardless of the integer value, and so will round trip to +/// a `0` value. +class NullValue extends $pb.ProtobufEnum { + /// Null value. + static const NullValue NULL_VALUE = + NullValue._(0, _omitEnumNames ? '' : 'NULL_VALUE'); + + static const $core.List values = [ + NULL_VALUE, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 0); + static NullValue? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const NullValue._(super.v, super.n); +} + +const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbjson.dart new file mode 100644 index 00000000..36967b55 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbjson.dart @@ -0,0 +1,134 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/struct.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use nullValueDescriptor instead') +const NullValue$json = { + '1': 'NullValue', + '2': [ + {'1': 'NULL_VALUE', '2': 0}, + ], +}; + +/// Descriptor for `NullValue`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List nullValueDescriptor = + $convert.base64Decode('CglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAA'); + +@$core.Deprecated('Use structDescriptor instead') +const Struct$json = { + '1': 'Struct', + '2': [ + { + '1': 'fields', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.protobuf.Struct.FieldsEntry', + '10': 'fields' + }, + ], + '3': [Struct_FieldsEntry$json], +}; + +@$core.Deprecated('Use structDescriptor instead') +const Struct_FieldsEntry$json = { + '1': 'FieldsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + { + '1': 'value', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.protobuf.Value', + '10': 'value' + }, + ], + '7': {'7': true}, +}; + +/// Descriptor for `Struct`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List structDescriptor = $convert.base64Decode( + 'CgZTdHJ1Y3QSOwoGZmllbGRzGAEgAygLMiMuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZH' + 'NFbnRyeVIGZmllbGRzGlEKC0ZpZWxkc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVl' + 'GAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAE='); + +@$core.Deprecated('Use valueDescriptor instead') +const Value$json = { + '1': 'Value', + '2': [ + { + '1': 'null_value', + '3': 1, + '4': 1, + '5': 14, + '6': '.google.protobuf.NullValue', + '9': 0, + '10': 'nullValue' + }, + {'1': 'number_value', '3': 2, '4': 1, '5': 1, '9': 0, '10': 'numberValue'}, + {'1': 'string_value', '3': 3, '4': 1, '5': 9, '9': 0, '10': 'stringValue'}, + {'1': 'bool_value', '3': 4, '4': 1, '5': 8, '9': 0, '10': 'boolValue'}, + { + '1': 'struct_value', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.protobuf.Struct', + '9': 0, + '10': 'structValue' + }, + { + '1': 'list_value', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.protobuf.ListValue', + '9': 0, + '10': 'listValue' + }, + ], + '8': [ + {'1': 'kind'}, + ], +}; + +/// Descriptor for `Value`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List valueDescriptor = $convert.base64Decode( + 'CgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZU' + 'gAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0' + 'cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCW' + 'Jvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0' + 'SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTG' + 'lzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5k'); + +@$core.Deprecated('Use listValueDescriptor instead') +const ListValue$json = { + '1': 'ListValue', + '2': [ + { + '1': 'values', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.protobuf.Value', + '10': 'values' + }, + ], +}; + +/// Descriptor for `ListValue`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listValueDescriptor = $convert.base64Decode( + 'CglMaXN0VmFsdWUSLgoGdmFsdWVzGAEgAygLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgZ2YW' + 'x1ZXM='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pb.dart new file mode 100644 index 00000000..bb72f183 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pb.dart @@ -0,0 +1,203 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/timestamp.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; +import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +/// A Timestamp represents a point in time independent of any time zone or local +/// calendar, encoded as a count of seconds and fractions of seconds at +/// nanosecond resolution. The count is relative to an epoch at UTC midnight on +/// January 1, 1970, in the proleptic Gregorian calendar which extends the +/// Gregorian calendar backwards to year one. +/// +/// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap +/// second table is needed for interpretation, using a [24-hour linear +/// smear](https://developers.google.com/time/smear). +/// +/// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By +/// restricting to that range, we ensure that we can convert to and from [RFC +/// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. +/// +/// # Examples +/// +/// Example 1: Compute Timestamp from POSIX `time()`. +/// +/// Timestamp timestamp; +/// timestamp.set_seconds(time(NULL)); +/// timestamp.set_nanos(0); +/// +/// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +/// +/// struct timeval tv; +/// gettimeofday(&tv, NULL); +/// +/// Timestamp timestamp; +/// timestamp.set_seconds(tv.tv_sec); +/// timestamp.set_nanos(tv.tv_usec * 1000); +/// +/// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +/// +/// FILETIME ft; +/// GetSystemTimeAsFileTime(&ft); +/// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +/// +/// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +/// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +/// Timestamp timestamp; +/// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +/// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +/// +/// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +/// +/// long millis = System.currentTimeMillis(); +/// +/// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +/// .setNanos((int) ((millis % 1000) * 1000000)).build(); +/// +/// Example 5: Compute Timestamp from Java `Instant.now()`. +/// +/// Instant now = Instant.now(); +/// +/// Timestamp timestamp = +/// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) +/// .setNanos(now.getNano()).build(); +/// +/// Example 6: Compute Timestamp from current time in Python. +/// +/// timestamp = Timestamp() +/// timestamp.GetCurrentTime() +/// +/// # JSON Mapping +/// +/// In JSON format, the Timestamp type is encoded as a string in the +/// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +/// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +/// where {year} is always expressed using four digits while {month}, {day}, +/// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +/// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +/// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +/// is required. A ProtoJSON serializer should always use UTC (as indicated by +/// "Z") when printing the Timestamp type and a ProtoJSON parser should be +/// able to accept both UTC and other timezones (as indicated by an offset). +/// +/// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +/// 01:30 UTC on January 15, 2017. +/// +/// In JavaScript, one can convert a Date object to this format using the +/// standard +/// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) +/// method. In Python, a standard `datetime.datetime` object can be converted +/// to this format using +/// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with +/// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use +/// the Joda Time's [`ISODateTimeFormat.dateTime()`]( +/// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() +/// ) to obtain a formatter capable of generating timestamps in this format. +class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { + factory Timestamp({ + $fixnum.Int64? seconds, + $core.int? nanos, + }) { + final $result = create(); + if (seconds != null) { + $result.seconds = seconds; + } + if (nanos != null) { + $result.nanos = nanos; + } + return $result; + } + Timestamp._() : super(); + factory Timestamp.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Timestamp.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Timestamp', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.protobuf'), + createEmptyInstance: create, + toProto3Json: $mixin.TimestampMixin.toProto3JsonHelper, + fromProto3Json: $mixin.TimestampMixin.fromProto3JsonHelper) + ..aInt64(1, _omitFieldNames ? '' : 'seconds') + ..a<$core.int>(2, _omitFieldNames ? '' : 'nanos', $pb.PbFieldType.O3) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Timestamp clone() => Timestamp()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Timestamp copyWith(void Function(Timestamp) updates) => + super.copyWith((message) => updates(message as Timestamp)) as Timestamp; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Timestamp create() => Timestamp._(); + Timestamp createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Timestamp getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Timestamp? _defaultInstance; + + /// Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must + /// be between -62135596800 and 253402300799 inclusive (which corresponds to + /// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z). + @$pb.TagNumber(1) + $fixnum.Int64 get seconds => $_getI64(0); + @$pb.TagNumber(1) + set seconds($fixnum.Int64 v) { + $_setInt64(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSeconds() => $_has(0); + @$pb.TagNumber(1) + void clearSeconds() => $_clearField(1); + + /// Non-negative fractions of a second at nanosecond resolution. This field is + /// the nanosecond portion of the duration, not an alternative to seconds. + /// Negative second values with fractions must still have non-negative nanos + /// values that count forward in time. Must be between 0 and 999,999,999 + /// inclusive. + @$pb.TagNumber(2) + $core.int get nanos => $_getIZ(1); + @$pb.TagNumber(2) + set nanos($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNanos() => $_has(1); + @$pb.TagNumber(2) + void clearNanos() => $_clearField(2); + + /// Creates a new instance from [dateTime]. + /// + /// Time zone information will not be preserved. + static Timestamp fromDateTime($core.DateTime dateTime) { + final result = create(); + $mixin.TimestampMixin.setFromDateTime(result, dateTime); + return result; + } +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbenum.dart new file mode 100644 index 00000000..1eaa8d17 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbenum.dart @@ -0,0 +1,10 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/timestamp.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbjson.dart new file mode 100644 index 00000000..2fc1450f --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbjson.dart @@ -0,0 +1,28 @@ +// +// Generated code. Do not modify. +// source: google/protobuf/timestamp.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use timestampDescriptor instead') +const Timestamp$json = { + '1': 'Timestamp', + '2': [ + {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'}, + {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'}, + ], +}; + +/// Descriptor for `Timestamp`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List timestampDescriptor = $convert.base64Decode( + 'CglUaW1lc3RhbXASGAoHc2Vjb25kcxgBIAEoA1IHc2Vjb25kcxIUCgVuYW5vcxgCIAEoBVIFbm' + 'Fub3M='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pb.dart new file mode 100644 index 00000000..11ac91e5 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pb.dart @@ -0,0 +1,9371 @@ +// +// Generated code. Do not modify. +// source: google/pubsub/v1/pubsub.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +import '../../protobuf/duration.pb.dart' as $5; +import '../../protobuf/field_mask.pb.dart' as $6; +import '../../protobuf/struct.pb.dart' as $4; +import '../../protobuf/timestamp.pb.dart' as $3; +import 'pubsub.pbenum.dart'; +import 'schema.pbenum.dart' as $2; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +export 'pubsub.pbenum.dart'; + +/// A policy constraining the storage of messages published to the topic. +class MessageStoragePolicy extends $pb.GeneratedMessage { + factory MessageStoragePolicy({ + $core.Iterable<$core.String>? allowedPersistenceRegions, + $core.bool? enforceInTransit, + }) { + final $result = create(); + if (allowedPersistenceRegions != null) { + $result.allowedPersistenceRegions.addAll(allowedPersistenceRegions); + } + if (enforceInTransit != null) { + $result.enforceInTransit = enforceInTransit; + } + return $result; + } + MessageStoragePolicy._() : super(); + factory MessageStoragePolicy.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory MessageStoragePolicy.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'MessageStoragePolicy', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pPS(1, _omitFieldNames ? '' : 'allowedPersistenceRegions') + ..aOB(2, _omitFieldNames ? '' : 'enforceInTransit') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + MessageStoragePolicy clone() => + MessageStoragePolicy()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + MessageStoragePolicy copyWith(void Function(MessageStoragePolicy) updates) => + super.copyWith((message) => updates(message as MessageStoragePolicy)) + as MessageStoragePolicy; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static MessageStoragePolicy create() => MessageStoragePolicy._(); + MessageStoragePolicy createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static MessageStoragePolicy getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static MessageStoragePolicy? _defaultInstance; + + /// Optional. A list of IDs of Google Cloud regions where messages that are + /// published to the topic may be persisted in storage. Messages published by + /// publishers running in non-allowed Google Cloud regions (or running outside + /// of Google Cloud altogether) are routed for storage in one of the allowed + /// regions. An empty list means that no regions are allowed, and is not a + /// valid configuration. + @$pb.TagNumber(1) + $pb.PbList<$core.String> get allowedPersistenceRegions => $_getList(0); + + /// Optional. If true, `allowed_persistence_regions` is also used to enforce + /// in-transit guarantees for messages. That is, Pub/Sub will fail + /// Publish operations on this topic and subscribe operations + /// on any subscription attached to this topic in any region that is + /// not in `allowed_persistence_regions`. + @$pb.TagNumber(2) + $core.bool get enforceInTransit => $_getBF(1); + @$pb.TagNumber(2) + set enforceInTransit($core.bool v) { + $_setBool(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasEnforceInTransit() => $_has(1); + @$pb.TagNumber(2) + void clearEnforceInTransit() => $_clearField(2); +} + +/// Settings for validating messages published against a schema. +class SchemaSettings extends $pb.GeneratedMessage { + factory SchemaSettings({ + $core.String? schema, + $2.Encoding? encoding, + $core.String? firstRevisionId, + $core.String? lastRevisionId, + }) { + final $result = create(); + if (schema != null) { + $result.schema = schema; + } + if (encoding != null) { + $result.encoding = encoding; + } + if (firstRevisionId != null) { + $result.firstRevisionId = firstRevisionId; + } + if (lastRevisionId != null) { + $result.lastRevisionId = lastRevisionId; + } + return $result; + } + SchemaSettings._() : super(); + factory SchemaSettings.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SchemaSettings.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SchemaSettings', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'schema') + ..e<$2.Encoding>(2, _omitFieldNames ? '' : 'encoding', $pb.PbFieldType.OE, + defaultOrMaker: $2.Encoding.ENCODING_UNSPECIFIED, + valueOf: $2.Encoding.valueOf, + enumValues: $2.Encoding.values) + ..aOS(3, _omitFieldNames ? '' : 'firstRevisionId') + ..aOS(4, _omitFieldNames ? '' : 'lastRevisionId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SchemaSettings clone() => SchemaSettings()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SchemaSettings copyWith(void Function(SchemaSettings) updates) => + super.copyWith((message) => updates(message as SchemaSettings)) + as SchemaSettings; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SchemaSettings create() => SchemaSettings._(); + SchemaSettings createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SchemaSettings getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SchemaSettings? _defaultInstance; + + /// Required. The name of the schema that messages published should be + /// validated against. Format is `projects/{project}/schemas/{schema}`. The + /// value of this field will be `_deleted-schema_` if the schema has been + /// deleted. + @$pb.TagNumber(1) + $core.String get schema => $_getSZ(0); + @$pb.TagNumber(1) + set schema($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSchema() => $_has(0); + @$pb.TagNumber(1) + void clearSchema() => $_clearField(1); + + /// Optional. The encoding of messages validated against `schema`. + @$pb.TagNumber(2) + $2.Encoding get encoding => $_getN(1); + @$pb.TagNumber(2) + set encoding($2.Encoding v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasEncoding() => $_has(1); + @$pb.TagNumber(2) + void clearEncoding() => $_clearField(2); + + /// Optional. The minimum (inclusive) revision allowed for validating messages. + /// If empty or not present, allow any revision to be validated against + /// last_revision or any revision created before. + @$pb.TagNumber(3) + $core.String get firstRevisionId => $_getSZ(2); + @$pb.TagNumber(3) + set firstRevisionId($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasFirstRevisionId() => $_has(2); + @$pb.TagNumber(3) + void clearFirstRevisionId() => $_clearField(3); + + /// Optional. The maximum (inclusive) revision allowed for validating messages. + /// If empty or not present, allow any revision to be validated against + /// first_revision or any revision created after. + @$pb.TagNumber(4) + $core.String get lastRevisionId => $_getSZ(3); + @$pb.TagNumber(4) + set lastRevisionId($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasLastRevisionId() => $_has(3); + @$pb.TagNumber(4) + void clearLastRevisionId() => $_clearField(4); +} + +/// Ingestion settings for Amazon Kinesis Data Streams. +class IngestionDataSourceSettings_AwsKinesis extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings_AwsKinesis({ + IngestionDataSourceSettings_AwsKinesis_State? state, + $core.String? streamArn, + $core.String? consumerArn, + $core.String? awsRoleArn, + $core.String? gcpServiceAccount, + }) { + final $result = create(); + if (state != null) { + $result.state = state; + } + if (streamArn != null) { + $result.streamArn = streamArn; + } + if (consumerArn != null) { + $result.consumerArn = consumerArn; + } + if (awsRoleArn != null) { + $result.awsRoleArn = awsRoleArn; + } + if (gcpServiceAccount != null) { + $result.gcpServiceAccount = gcpServiceAccount; + } + return $result; + } + IngestionDataSourceSettings_AwsKinesis._() : super(); + factory IngestionDataSourceSettings_AwsKinesis.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings_AwsKinesis.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionDataSourceSettings.AwsKinesis', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..e( + 1, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: + IngestionDataSourceSettings_AwsKinesis_State.STATE_UNSPECIFIED, + valueOf: IngestionDataSourceSettings_AwsKinesis_State.valueOf, + enumValues: IngestionDataSourceSettings_AwsKinesis_State.values) + ..aOS(2, _omitFieldNames ? '' : 'streamArn') + ..aOS(3, _omitFieldNames ? '' : 'consumerArn') + ..aOS(4, _omitFieldNames ? '' : 'awsRoleArn') + ..aOS(5, _omitFieldNames ? '' : 'gcpServiceAccount') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_AwsKinesis clone() => + IngestionDataSourceSettings_AwsKinesis()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_AwsKinesis copyWith( + void Function(IngestionDataSourceSettings_AwsKinesis) updates) => + super.copyWith((message) => + updates(message as IngestionDataSourceSettings_AwsKinesis)) + as IngestionDataSourceSettings_AwsKinesis; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_AwsKinesis create() => + IngestionDataSourceSettings_AwsKinesis._(); + IngestionDataSourceSettings_AwsKinesis createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_AwsKinesis getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionDataSourceSettings_AwsKinesis>(create); + static IngestionDataSourceSettings_AwsKinesis? _defaultInstance; + + /// Output only. An output-only field that indicates the state of the Kinesis + /// ingestion source. + @$pb.TagNumber(1) + IngestionDataSourceSettings_AwsKinesis_State get state => $_getN(0); + @$pb.TagNumber(1) + set state(IngestionDataSourceSettings_AwsKinesis_State v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasState() => $_has(0); + @$pb.TagNumber(1) + void clearState() => $_clearField(1); + + /// Required. The Kinesis stream ARN to ingest data from. + @$pb.TagNumber(2) + $core.String get streamArn => $_getSZ(1); + @$pb.TagNumber(2) + set streamArn($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasStreamArn() => $_has(1); + @$pb.TagNumber(2) + void clearStreamArn() => $_clearField(2); + + /// Required. The Kinesis consumer ARN to used for ingestion in Enhanced + /// Fan-Out mode. The consumer must be already created and ready to be used. + @$pb.TagNumber(3) + $core.String get consumerArn => $_getSZ(2); + @$pb.TagNumber(3) + set consumerArn($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasConsumerArn() => $_has(2); + @$pb.TagNumber(3) + void clearConsumerArn() => $_clearField(3); + + /// Required. AWS role ARN to be used for Federated Identity authentication + /// with Kinesis. Check the Pub/Sub docs for how to set up this role and the + /// required permissions that need to be attached to it. + @$pb.TagNumber(4) + $core.String get awsRoleArn => $_getSZ(3); + @$pb.TagNumber(4) + set awsRoleArn($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasAwsRoleArn() => $_has(3); + @$pb.TagNumber(4) + void clearAwsRoleArn() => $_clearField(4); + + /// Required. The GCP service account to be used for Federated Identity + /// authentication with Kinesis (via a `AssumeRoleWithWebIdentity` call for + /// the provided role). The `aws_role_arn` must be set up with + /// `accounts.google.com:sub` equals to this service account number. + @$pb.TagNumber(5) + $core.String get gcpServiceAccount => $_getSZ(4); + @$pb.TagNumber(5) + set gcpServiceAccount($core.String v) { + $_setString(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasGcpServiceAccount() => $_has(4); + @$pb.TagNumber(5) + void clearGcpServiceAccount() => $_clearField(5); +} + +/// Configuration for reading Cloud Storage data in text format. Each line of +/// text as specified by the delimiter will be set to the `data` field of a +/// Pub/Sub message. +class IngestionDataSourceSettings_CloudStorage_TextFormat + extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings_CloudStorage_TextFormat({ + $core.String? delimiter, + }) { + final $result = create(); + if (delimiter != null) { + $result.delimiter = delimiter; + } + return $result; + } + IngestionDataSourceSettings_CloudStorage_TextFormat._() : super(); + factory IngestionDataSourceSettings_CloudStorage_TextFormat.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings_CloudStorage_TextFormat.fromJson( + $core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames + ? '' + : 'IngestionDataSourceSettings.CloudStorage.TextFormat', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'delimiter') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_CloudStorage_TextFormat clone() => + IngestionDataSourceSettings_CloudStorage_TextFormat() + ..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_CloudStorage_TextFormat copyWith( + void Function(IngestionDataSourceSettings_CloudStorage_TextFormat) + updates) => + super.copyWith((message) => updates( + message as IngestionDataSourceSettings_CloudStorage_TextFormat)) + as IngestionDataSourceSettings_CloudStorage_TextFormat; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_CloudStorage_TextFormat create() => + IngestionDataSourceSettings_CloudStorage_TextFormat._(); + IngestionDataSourceSettings_CloudStorage_TextFormat createEmptyInstance() => + create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_CloudStorage_TextFormat getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionDataSourceSettings_CloudStorage_TextFormat>(create); + static IngestionDataSourceSettings_CloudStorage_TextFormat? _defaultInstance; + + /// Optional. When unset, '\n' is used. + @$pb.TagNumber(1) + $core.String get delimiter => $_getSZ(0); + @$pb.TagNumber(1) + set delimiter($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasDelimiter() => $_has(0); + @$pb.TagNumber(1) + void clearDelimiter() => $_clearField(1); +} + +/// Configuration for reading Cloud Storage data in Avro binary format. The +/// bytes of each object will be set to the `data` field of a Pub/Sub +/// message. +class IngestionDataSourceSettings_CloudStorage_AvroFormat + extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings_CloudStorage_AvroFormat() => create(); + IngestionDataSourceSettings_CloudStorage_AvroFormat._() : super(); + factory IngestionDataSourceSettings_CloudStorage_AvroFormat.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings_CloudStorage_AvroFormat.fromJson( + $core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames + ? '' + : 'IngestionDataSourceSettings.CloudStorage.AvroFormat', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_CloudStorage_AvroFormat clone() => + IngestionDataSourceSettings_CloudStorage_AvroFormat() + ..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_CloudStorage_AvroFormat copyWith( + void Function(IngestionDataSourceSettings_CloudStorage_AvroFormat) + updates) => + super.copyWith((message) => updates( + message as IngestionDataSourceSettings_CloudStorage_AvroFormat)) + as IngestionDataSourceSettings_CloudStorage_AvroFormat; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_CloudStorage_AvroFormat create() => + IngestionDataSourceSettings_CloudStorage_AvroFormat._(); + IngestionDataSourceSettings_CloudStorage_AvroFormat createEmptyInstance() => + create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_CloudStorage_AvroFormat getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionDataSourceSettings_CloudStorage_AvroFormat>(create); + static IngestionDataSourceSettings_CloudStorage_AvroFormat? _defaultInstance; +} + +/// Configuration for reading Cloud Storage data written via [Cloud Storage +/// subscriptions](https://cloud.google.com/pubsub/docs/cloudstorage). The +/// data and attributes fields of the originally exported Pub/Sub message +/// will be restored when publishing. +class IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat + extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat() => + create(); + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat._() : super(); + factory IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat.fromJson( + $core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames + ? '' + : 'IngestionDataSourceSettings.CloudStorage.PubSubAvroFormat', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat clone() => + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat() + ..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat copyWith( + void Function( + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat) + updates) => + super.copyWith((message) => updates(message + as IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat)) + as IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat create() => + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat._(); + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat + createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => $pb.PbList< + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat>(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat + getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat>(create); + static IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat? + _defaultInstance; +} + +enum IngestionDataSourceSettings_CloudStorage_InputFormat { + textFormat, + avroFormat, + pubsubAvroFormat, + notSet +} + +/// Ingestion settings for Cloud Storage. +class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings_CloudStorage({ + IngestionDataSourceSettings_CloudStorage_State? state, + $core.String? bucket, + IngestionDataSourceSettings_CloudStorage_TextFormat? textFormat, + IngestionDataSourceSettings_CloudStorage_AvroFormat? avroFormat, + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat? pubsubAvroFormat, + $3.Timestamp? minimumObjectCreateTime, + $core.String? matchGlob, + }) { + final $result = create(); + if (state != null) { + $result.state = state; + } + if (bucket != null) { + $result.bucket = bucket; + } + if (textFormat != null) { + $result.textFormat = textFormat; + } + if (avroFormat != null) { + $result.avroFormat = avroFormat; + } + if (pubsubAvroFormat != null) { + $result.pubsubAvroFormat = pubsubAvroFormat; + } + if (minimumObjectCreateTime != null) { + $result.minimumObjectCreateTime = minimumObjectCreateTime; + } + if (matchGlob != null) { + $result.matchGlob = matchGlob; + } + return $result; + } + IngestionDataSourceSettings_CloudStorage._() : super(); + factory IngestionDataSourceSettings_CloudStorage.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings_CloudStorage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core + .Map<$core.int, IngestionDataSourceSettings_CloudStorage_InputFormat> + _IngestionDataSourceSettings_CloudStorage_InputFormatByTag = { + 3: IngestionDataSourceSettings_CloudStorage_InputFormat.textFormat, + 4: IngestionDataSourceSettings_CloudStorage_InputFormat.avroFormat, + 5: IngestionDataSourceSettings_CloudStorage_InputFormat.pubsubAvroFormat, + 0: IngestionDataSourceSettings_CloudStorage_InputFormat.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionDataSourceSettings.CloudStorage', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [3, 4, 5]) + ..e( + 1, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: + IngestionDataSourceSettings_CloudStorage_State.STATE_UNSPECIFIED, + valueOf: IngestionDataSourceSettings_CloudStorage_State.valueOf, + enumValues: IngestionDataSourceSettings_CloudStorage_State.values) + ..aOS(2, _omitFieldNames ? '' : 'bucket') + ..aOM( + 3, _omitFieldNames ? '' : 'textFormat', + subBuilder: IngestionDataSourceSettings_CloudStorage_TextFormat.create) + ..aOM( + 4, _omitFieldNames ? '' : 'avroFormat', + subBuilder: IngestionDataSourceSettings_CloudStorage_AvroFormat.create) + ..aOM( + 5, _omitFieldNames ? '' : 'pubsubAvroFormat', + subBuilder: + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat.create) + ..aOM<$3.Timestamp>(6, _omitFieldNames ? '' : 'minimumObjectCreateTime', + subBuilder: $3.Timestamp.create) + ..aOS(9, _omitFieldNames ? '' : 'matchGlob') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_CloudStorage clone() => + IngestionDataSourceSettings_CloudStorage()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_CloudStorage copyWith( + void Function(IngestionDataSourceSettings_CloudStorage) updates) => + super.copyWith((message) => + updates(message as IngestionDataSourceSettings_CloudStorage)) + as IngestionDataSourceSettings_CloudStorage; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_CloudStorage create() => + IngestionDataSourceSettings_CloudStorage._(); + IngestionDataSourceSettings_CloudStorage createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_CloudStorage getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionDataSourceSettings_CloudStorage>(create); + static IngestionDataSourceSettings_CloudStorage? _defaultInstance; + + IngestionDataSourceSettings_CloudStorage_InputFormat whichInputFormat() => + _IngestionDataSourceSettings_CloudStorage_InputFormatByTag[ + $_whichOneof(0)]!; + void clearInputFormat() => $_clearField($_whichOneof(0)); + + /// Output only. An output-only field that indicates the state of the Cloud + /// Storage ingestion source. + @$pb.TagNumber(1) + IngestionDataSourceSettings_CloudStorage_State get state => $_getN(0); + @$pb.TagNumber(1) + set state(IngestionDataSourceSettings_CloudStorage_State v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasState() => $_has(0); + @$pb.TagNumber(1) + void clearState() => $_clearField(1); + + /// Optional. Cloud Storage bucket. The bucket name must be without any + /// prefix like "gs://". See the [bucket naming requirements] + /// (https://cloud.google.com/storage/docs/buckets#naming). + @$pb.TagNumber(2) + $core.String get bucket => $_getSZ(1); + @$pb.TagNumber(2) + set bucket($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasBucket() => $_has(1); + @$pb.TagNumber(2) + void clearBucket() => $_clearField(2); + + /// Optional. Data from Cloud Storage will be interpreted as text. + @$pb.TagNumber(3) + IngestionDataSourceSettings_CloudStorage_TextFormat get textFormat => + $_getN(2); + @$pb.TagNumber(3) + set textFormat(IngestionDataSourceSettings_CloudStorage_TextFormat v) { + $_setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasTextFormat() => $_has(2); + @$pb.TagNumber(3) + void clearTextFormat() => $_clearField(3); + @$pb.TagNumber(3) + IngestionDataSourceSettings_CloudStorage_TextFormat ensureTextFormat() => + $_ensure(2); + + /// Optional. Data from Cloud Storage will be interpreted in Avro format. + @$pb.TagNumber(4) + IngestionDataSourceSettings_CloudStorage_AvroFormat get avroFormat => + $_getN(3); + @$pb.TagNumber(4) + set avroFormat(IngestionDataSourceSettings_CloudStorage_AvroFormat v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasAvroFormat() => $_has(3); + @$pb.TagNumber(4) + void clearAvroFormat() => $_clearField(4); + @$pb.TagNumber(4) + IngestionDataSourceSettings_CloudStorage_AvroFormat ensureAvroFormat() => + $_ensure(3); + + /// Optional. It will be assumed data from Cloud Storage was written via + /// [Cloud Storage + /// subscriptions](https://cloud.google.com/pubsub/docs/cloudstorage). + @$pb.TagNumber(5) + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat + get pubsubAvroFormat => $_getN(4); + @$pb.TagNumber(5) + set pubsubAvroFormat( + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasPubsubAvroFormat() => $_has(4); + @$pb.TagNumber(5) + void clearPubsubAvroFormat() => $_clearField(5); + @$pb.TagNumber(5) + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat + ensurePubsubAvroFormat() => $_ensure(4); + + /// Optional. Only objects with a larger or equal creation timestamp will be + /// ingested. + @$pb.TagNumber(6) + $3.Timestamp get minimumObjectCreateTime => $_getN(5); + @$pb.TagNumber(6) + set minimumObjectCreateTime($3.Timestamp v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasMinimumObjectCreateTime() => $_has(5); + @$pb.TagNumber(6) + void clearMinimumObjectCreateTime() => $_clearField(6); + @$pb.TagNumber(6) + $3.Timestamp ensureMinimumObjectCreateTime() => $_ensure(5); + + /// Optional. Glob pattern used to match objects that will be ingested. If + /// unset, all objects will be ingested. See the [supported + /// patterns](https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-objects-and-prefixes-using-glob). + @$pb.TagNumber(9) + $core.String get matchGlob => $_getSZ(6); + @$pb.TagNumber(9) + set matchGlob($core.String v) { + $_setString(6, v); + } + + @$pb.TagNumber(9) + $core.bool hasMatchGlob() => $_has(6); + @$pb.TagNumber(9) + void clearMatchGlob() => $_clearField(9); +} + +/// Ingestion settings for Azure Event Hubs. +class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings_AzureEventHubs({ + IngestionDataSourceSettings_AzureEventHubs_State? state, + $core.String? resourceGroup, + $core.String? namespace, + $core.String? eventHub, + $core.String? clientId, + $core.String? tenantId, + $core.String? subscriptionId, + $core.String? gcpServiceAccount, + }) { + final $result = create(); + if (state != null) { + $result.state = state; + } + if (resourceGroup != null) { + $result.resourceGroup = resourceGroup; + } + if (namespace != null) { + $result.namespace = namespace; + } + if (eventHub != null) { + $result.eventHub = eventHub; + } + if (clientId != null) { + $result.clientId = clientId; + } + if (tenantId != null) { + $result.tenantId = tenantId; + } + if (subscriptionId != null) { + $result.subscriptionId = subscriptionId; + } + if (gcpServiceAccount != null) { + $result.gcpServiceAccount = gcpServiceAccount; + } + return $result; + } + IngestionDataSourceSettings_AzureEventHubs._() : super(); + factory IngestionDataSourceSettings_AzureEventHubs.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings_AzureEventHubs.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionDataSourceSettings.AzureEventHubs', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..e( + 1, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: + IngestionDataSourceSettings_AzureEventHubs_State.STATE_UNSPECIFIED, + valueOf: IngestionDataSourceSettings_AzureEventHubs_State.valueOf, + enumValues: IngestionDataSourceSettings_AzureEventHubs_State.values) + ..aOS(2, _omitFieldNames ? '' : 'resourceGroup') + ..aOS(3, _omitFieldNames ? '' : 'namespace') + ..aOS(4, _omitFieldNames ? '' : 'eventHub') + ..aOS(5, _omitFieldNames ? '' : 'clientId') + ..aOS(6, _omitFieldNames ? '' : 'tenantId') + ..aOS(7, _omitFieldNames ? '' : 'subscriptionId') + ..aOS(8, _omitFieldNames ? '' : 'gcpServiceAccount') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_AzureEventHubs clone() => + IngestionDataSourceSettings_AzureEventHubs()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_AzureEventHubs copyWith( + void Function(IngestionDataSourceSettings_AzureEventHubs) updates) => + super.copyWith((message) => + updates(message as IngestionDataSourceSettings_AzureEventHubs)) + as IngestionDataSourceSettings_AzureEventHubs; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_AzureEventHubs create() => + IngestionDataSourceSettings_AzureEventHubs._(); + IngestionDataSourceSettings_AzureEventHubs createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_AzureEventHubs getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionDataSourceSettings_AzureEventHubs>(create); + static IngestionDataSourceSettings_AzureEventHubs? _defaultInstance; + + /// Output only. An output-only field that indicates the state of the Event + /// Hubs ingestion source. + @$pb.TagNumber(1) + IngestionDataSourceSettings_AzureEventHubs_State get state => $_getN(0); + @$pb.TagNumber(1) + set state(IngestionDataSourceSettings_AzureEventHubs_State v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasState() => $_has(0); + @$pb.TagNumber(1) + void clearState() => $_clearField(1); + + /// Optional. Name of the resource group within the azure subscription. + @$pb.TagNumber(2) + $core.String get resourceGroup => $_getSZ(1); + @$pb.TagNumber(2) + set resourceGroup($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasResourceGroup() => $_has(1); + @$pb.TagNumber(2) + void clearResourceGroup() => $_clearField(2); + + /// Optional. The name of the Event Hubs namespace. + @$pb.TagNumber(3) + $core.String get namespace => $_getSZ(2); + @$pb.TagNumber(3) + set namespace($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasNamespace() => $_has(2); + @$pb.TagNumber(3) + void clearNamespace() => $_clearField(3); + + /// Optional. The name of the Event Hub. + @$pb.TagNumber(4) + $core.String get eventHub => $_getSZ(3); + @$pb.TagNumber(4) + set eventHub($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasEventHub() => $_has(3); + @$pb.TagNumber(4) + void clearEventHub() => $_clearField(4); + + /// Optional. The client id of the Azure application that is being used to + /// authenticate Pub/Sub. + @$pb.TagNumber(5) + $core.String get clientId => $_getSZ(4); + @$pb.TagNumber(5) + set clientId($core.String v) { + $_setString(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasClientId() => $_has(4); + @$pb.TagNumber(5) + void clearClientId() => $_clearField(5); + + /// Optional. The tenant id of the Azure application that is being used to + /// authenticate Pub/Sub. + @$pb.TagNumber(6) + $core.String get tenantId => $_getSZ(5); + @$pb.TagNumber(6) + set tenantId($core.String v) { + $_setString(5, v); + } + + @$pb.TagNumber(6) + $core.bool hasTenantId() => $_has(5); + @$pb.TagNumber(6) + void clearTenantId() => $_clearField(6); + + /// Optional. The Azure subscription id. + @$pb.TagNumber(7) + $core.String get subscriptionId => $_getSZ(6); + @$pb.TagNumber(7) + set subscriptionId($core.String v) { + $_setString(6, v); + } + + @$pb.TagNumber(7) + $core.bool hasSubscriptionId() => $_has(6); + @$pb.TagNumber(7) + void clearSubscriptionId() => $_clearField(7); + + /// Optional. The GCP service account to be used for Federated Identity + /// authentication. + @$pb.TagNumber(8) + $core.String get gcpServiceAccount => $_getSZ(7); + @$pb.TagNumber(8) + set gcpServiceAccount($core.String v) { + $_setString(7, v); + } + + @$pb.TagNumber(8) + $core.bool hasGcpServiceAccount() => $_has(7); + @$pb.TagNumber(8) + void clearGcpServiceAccount() => $_clearField(8); +} + +/// Ingestion settings for Amazon MSK. +class IngestionDataSourceSettings_AwsMsk extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings_AwsMsk({ + IngestionDataSourceSettings_AwsMsk_State? state, + $core.String? clusterArn, + $core.String? topic, + $core.String? awsRoleArn, + $core.String? gcpServiceAccount, + }) { + final $result = create(); + if (state != null) { + $result.state = state; + } + if (clusterArn != null) { + $result.clusterArn = clusterArn; + } + if (topic != null) { + $result.topic = topic; + } + if (awsRoleArn != null) { + $result.awsRoleArn = awsRoleArn; + } + if (gcpServiceAccount != null) { + $result.gcpServiceAccount = gcpServiceAccount; + } + return $result; + } + IngestionDataSourceSettings_AwsMsk._() : super(); + factory IngestionDataSourceSettings_AwsMsk.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings_AwsMsk.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionDataSourceSettings.AwsMsk', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..e( + 1, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: + IngestionDataSourceSettings_AwsMsk_State.STATE_UNSPECIFIED, + valueOf: IngestionDataSourceSettings_AwsMsk_State.valueOf, + enumValues: IngestionDataSourceSettings_AwsMsk_State.values) + ..aOS(2, _omitFieldNames ? '' : 'clusterArn') + ..aOS(3, _omitFieldNames ? '' : 'topic') + ..aOS(4, _omitFieldNames ? '' : 'awsRoleArn') + ..aOS(5, _omitFieldNames ? '' : 'gcpServiceAccount') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_AwsMsk clone() => + IngestionDataSourceSettings_AwsMsk()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_AwsMsk copyWith( + void Function(IngestionDataSourceSettings_AwsMsk) updates) => + super.copyWith((message) => + updates(message as IngestionDataSourceSettings_AwsMsk)) + as IngestionDataSourceSettings_AwsMsk; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_AwsMsk create() => + IngestionDataSourceSettings_AwsMsk._(); + IngestionDataSourceSettings_AwsMsk createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_AwsMsk getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor( + create); + static IngestionDataSourceSettings_AwsMsk? _defaultInstance; + + /// Output only. An output-only field that indicates the state of the Amazon + /// MSK ingestion source. + @$pb.TagNumber(1) + IngestionDataSourceSettings_AwsMsk_State get state => $_getN(0); + @$pb.TagNumber(1) + set state(IngestionDataSourceSettings_AwsMsk_State v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasState() => $_has(0); + @$pb.TagNumber(1) + void clearState() => $_clearField(1); + + /// Required. The Amazon Resource Name (ARN) that uniquely identifies the + /// cluster. + @$pb.TagNumber(2) + $core.String get clusterArn => $_getSZ(1); + @$pb.TagNumber(2) + set clusterArn($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasClusterArn() => $_has(1); + @$pb.TagNumber(2) + void clearClusterArn() => $_clearField(2); + + /// Required. The name of the topic in the Amazon MSK cluster that Pub/Sub + /// will import from. + @$pb.TagNumber(3) + $core.String get topic => $_getSZ(2); + @$pb.TagNumber(3) + set topic($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasTopic() => $_has(2); + @$pb.TagNumber(3) + void clearTopic() => $_clearField(3); + + /// Required. AWS role ARN to be used for Federated Identity authentication + /// with Amazon MSK. Check the Pub/Sub docs for how to set up this role and + /// the required permissions that need to be attached to it. + @$pb.TagNumber(4) + $core.String get awsRoleArn => $_getSZ(3); + @$pb.TagNumber(4) + set awsRoleArn($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasAwsRoleArn() => $_has(3); + @$pb.TagNumber(4) + void clearAwsRoleArn() => $_clearField(4); + + /// Required. The GCP service account to be used for Federated Identity + /// authentication with Amazon MSK (via a `AssumeRoleWithWebIdentity` call + /// for the provided role). The `aws_role_arn` must be set up with + /// `accounts.google.com:sub` equals to this service account number. + @$pb.TagNumber(5) + $core.String get gcpServiceAccount => $_getSZ(4); + @$pb.TagNumber(5) + set gcpServiceAccount($core.String v) { + $_setString(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasGcpServiceAccount() => $_has(4); + @$pb.TagNumber(5) + void clearGcpServiceAccount() => $_clearField(5); +} + +/// Ingestion settings for Confluent Cloud. +class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings_ConfluentCloud({ + IngestionDataSourceSettings_ConfluentCloud_State? state, + $core.String? bootstrapServer, + $core.String? clusterId, + $core.String? topic, + $core.String? identityPoolId, + $core.String? gcpServiceAccount, + }) { + final $result = create(); + if (state != null) { + $result.state = state; + } + if (bootstrapServer != null) { + $result.bootstrapServer = bootstrapServer; + } + if (clusterId != null) { + $result.clusterId = clusterId; + } + if (topic != null) { + $result.topic = topic; + } + if (identityPoolId != null) { + $result.identityPoolId = identityPoolId; + } + if (gcpServiceAccount != null) { + $result.gcpServiceAccount = gcpServiceAccount; + } + return $result; + } + IngestionDataSourceSettings_ConfluentCloud._() : super(); + factory IngestionDataSourceSettings_ConfluentCloud.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings_ConfluentCloud.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionDataSourceSettings.ConfluentCloud', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..e( + 1, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: + IngestionDataSourceSettings_ConfluentCloud_State.STATE_UNSPECIFIED, + valueOf: IngestionDataSourceSettings_ConfluentCloud_State.valueOf, + enumValues: IngestionDataSourceSettings_ConfluentCloud_State.values) + ..aOS(2, _omitFieldNames ? '' : 'bootstrapServer') + ..aOS(3, _omitFieldNames ? '' : 'clusterId') + ..aOS(4, _omitFieldNames ? '' : 'topic') + ..aOS(5, _omitFieldNames ? '' : 'identityPoolId') + ..aOS(6, _omitFieldNames ? '' : 'gcpServiceAccount') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_ConfluentCloud clone() => + IngestionDataSourceSettings_ConfluentCloud()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings_ConfluentCloud copyWith( + void Function(IngestionDataSourceSettings_ConfluentCloud) updates) => + super.copyWith((message) => + updates(message as IngestionDataSourceSettings_ConfluentCloud)) + as IngestionDataSourceSettings_ConfluentCloud; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_ConfluentCloud create() => + IngestionDataSourceSettings_ConfluentCloud._(); + IngestionDataSourceSettings_ConfluentCloud createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings_ConfluentCloud getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionDataSourceSettings_ConfluentCloud>(create); + static IngestionDataSourceSettings_ConfluentCloud? _defaultInstance; + + /// Output only. An output-only field that indicates the state of the + /// Confluent Cloud ingestion source. + @$pb.TagNumber(1) + IngestionDataSourceSettings_ConfluentCloud_State get state => $_getN(0); + @$pb.TagNumber(1) + set state(IngestionDataSourceSettings_ConfluentCloud_State v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasState() => $_has(0); + @$pb.TagNumber(1) + void clearState() => $_clearField(1); + + /// Required. The address of the bootstrap server. The format is url:port. + @$pb.TagNumber(2) + $core.String get bootstrapServer => $_getSZ(1); + @$pb.TagNumber(2) + set bootstrapServer($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasBootstrapServer() => $_has(1); + @$pb.TagNumber(2) + void clearBootstrapServer() => $_clearField(2); + + /// Required. The id of the cluster. + @$pb.TagNumber(3) + $core.String get clusterId => $_getSZ(2); + @$pb.TagNumber(3) + set clusterId($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasClusterId() => $_has(2); + @$pb.TagNumber(3) + void clearClusterId() => $_clearField(3); + + /// Required. The name of the topic in the Confluent Cloud cluster that + /// Pub/Sub will import from. + @$pb.TagNumber(4) + $core.String get topic => $_getSZ(3); + @$pb.TagNumber(4) + set topic($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasTopic() => $_has(3); + @$pb.TagNumber(4) + void clearTopic() => $_clearField(4); + + /// Required. The id of the identity pool to be used for Federated Identity + /// authentication with Confluent Cloud. See + /// https://docs.confluent.io/cloud/current/security/authenticate/workload-identities/identity-providers/oauth/identity-pools.html#add-oauth-identity-pools. + @$pb.TagNumber(5) + $core.String get identityPoolId => $_getSZ(4); + @$pb.TagNumber(5) + set identityPoolId($core.String v) { + $_setString(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasIdentityPoolId() => $_has(4); + @$pb.TagNumber(5) + void clearIdentityPoolId() => $_clearField(5); + + /// Required. The GCP service account to be used for Federated Identity + /// authentication with `identity_pool_id`. + @$pb.TagNumber(6) + $core.String get gcpServiceAccount => $_getSZ(5); + @$pb.TagNumber(6) + set gcpServiceAccount($core.String v) { + $_setString(5, v); + } + + @$pb.TagNumber(6) + $core.bool hasGcpServiceAccount() => $_has(5); + @$pb.TagNumber(6) + void clearGcpServiceAccount() => $_clearField(6); +} + +enum IngestionDataSourceSettings_Source { + awsKinesis, + cloudStorage, + azureEventHubs, + awsMsk, + confluentCloud, + notSet +} + +/// Settings for an ingestion data source on a topic. +class IngestionDataSourceSettings extends $pb.GeneratedMessage { + factory IngestionDataSourceSettings({ + IngestionDataSourceSettings_AwsKinesis? awsKinesis, + IngestionDataSourceSettings_CloudStorage? cloudStorage, + IngestionDataSourceSettings_AzureEventHubs? azureEventHubs, + PlatformLogsSettings? platformLogsSettings, + IngestionDataSourceSettings_AwsMsk? awsMsk, + IngestionDataSourceSettings_ConfluentCloud? confluentCloud, + }) { + final $result = create(); + if (awsKinesis != null) { + $result.awsKinesis = awsKinesis; + } + if (cloudStorage != null) { + $result.cloudStorage = cloudStorage; + } + if (azureEventHubs != null) { + $result.azureEventHubs = azureEventHubs; + } + if (platformLogsSettings != null) { + $result.platformLogsSettings = platformLogsSettings; + } + if (awsMsk != null) { + $result.awsMsk = awsMsk; + } + if (confluentCloud != null) { + $result.confluentCloud = confluentCloud; + } + return $result; + } + IngestionDataSourceSettings._() : super(); + factory IngestionDataSourceSettings.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionDataSourceSettings.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, IngestionDataSourceSettings_Source> + _IngestionDataSourceSettings_SourceByTag = { + 1: IngestionDataSourceSettings_Source.awsKinesis, + 2: IngestionDataSourceSettings_Source.cloudStorage, + 3: IngestionDataSourceSettings_Source.azureEventHubs, + 5: IngestionDataSourceSettings_Source.awsMsk, + 6: IngestionDataSourceSettings_Source.confluentCloud, + 0: IngestionDataSourceSettings_Source.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionDataSourceSettings', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [1, 2, 3, 5, 6]) + ..aOM( + 1, _omitFieldNames ? '' : 'awsKinesis', + subBuilder: IngestionDataSourceSettings_AwsKinesis.create) + ..aOM( + 2, _omitFieldNames ? '' : 'cloudStorage', + subBuilder: IngestionDataSourceSettings_CloudStorage.create) + ..aOM( + 3, _omitFieldNames ? '' : 'azureEventHubs', + subBuilder: IngestionDataSourceSettings_AzureEventHubs.create) + ..aOM( + 4, _omitFieldNames ? '' : 'platformLogsSettings', + subBuilder: PlatformLogsSettings.create) + ..aOM( + 5, _omitFieldNames ? '' : 'awsMsk', + subBuilder: IngestionDataSourceSettings_AwsMsk.create) + ..aOM( + 6, _omitFieldNames ? '' : 'confluentCloud', + subBuilder: IngestionDataSourceSettings_ConfluentCloud.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings clone() => + IngestionDataSourceSettings()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionDataSourceSettings copyWith( + void Function(IngestionDataSourceSettings) updates) => + super.copyWith( + (message) => updates(message as IngestionDataSourceSettings)) + as IngestionDataSourceSettings; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings create() => + IngestionDataSourceSettings._(); + IngestionDataSourceSettings createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionDataSourceSettings getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static IngestionDataSourceSettings? _defaultInstance; + + IngestionDataSourceSettings_Source whichSource() => + _IngestionDataSourceSettings_SourceByTag[$_whichOneof(0)]!; + void clearSource() => $_clearField($_whichOneof(0)); + + /// Optional. Amazon Kinesis Data Streams. + @$pb.TagNumber(1) + IngestionDataSourceSettings_AwsKinesis get awsKinesis => $_getN(0); + @$pb.TagNumber(1) + set awsKinesis(IngestionDataSourceSettings_AwsKinesis v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasAwsKinesis() => $_has(0); + @$pb.TagNumber(1) + void clearAwsKinesis() => $_clearField(1); + @$pb.TagNumber(1) + IngestionDataSourceSettings_AwsKinesis ensureAwsKinesis() => $_ensure(0); + + /// Optional. Cloud Storage. + @$pb.TagNumber(2) + IngestionDataSourceSettings_CloudStorage get cloudStorage => $_getN(1); + @$pb.TagNumber(2) + set cloudStorage(IngestionDataSourceSettings_CloudStorage v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasCloudStorage() => $_has(1); + @$pb.TagNumber(2) + void clearCloudStorage() => $_clearField(2); + @$pb.TagNumber(2) + IngestionDataSourceSettings_CloudStorage ensureCloudStorage() => $_ensure(1); + + /// Optional. Azure Event Hubs. + @$pb.TagNumber(3) + IngestionDataSourceSettings_AzureEventHubs get azureEventHubs => $_getN(2); + @$pb.TagNumber(3) + set azureEventHubs(IngestionDataSourceSettings_AzureEventHubs v) { + $_setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasAzureEventHubs() => $_has(2); + @$pb.TagNumber(3) + void clearAzureEventHubs() => $_clearField(3); + @$pb.TagNumber(3) + IngestionDataSourceSettings_AzureEventHubs ensureAzureEventHubs() => + $_ensure(2); + + /// Optional. Platform Logs settings. If unset, no Platform Logs will be + /// generated. + @$pb.TagNumber(4) + PlatformLogsSettings get platformLogsSettings => $_getN(3); + @$pb.TagNumber(4) + set platformLogsSettings(PlatformLogsSettings v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasPlatformLogsSettings() => $_has(3); + @$pb.TagNumber(4) + void clearPlatformLogsSettings() => $_clearField(4); + @$pb.TagNumber(4) + PlatformLogsSettings ensurePlatformLogsSettings() => $_ensure(3); + + /// Optional. Amazon MSK. + @$pb.TagNumber(5) + IngestionDataSourceSettings_AwsMsk get awsMsk => $_getN(4); + @$pb.TagNumber(5) + set awsMsk(IngestionDataSourceSettings_AwsMsk v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasAwsMsk() => $_has(4); + @$pb.TagNumber(5) + void clearAwsMsk() => $_clearField(5); + @$pb.TagNumber(5) + IngestionDataSourceSettings_AwsMsk ensureAwsMsk() => $_ensure(4); + + /// Optional. Confluent Cloud. + @$pb.TagNumber(6) + IngestionDataSourceSettings_ConfluentCloud get confluentCloud => $_getN(5); + @$pb.TagNumber(6) + set confluentCloud(IngestionDataSourceSettings_ConfluentCloud v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasConfluentCloud() => $_has(5); + @$pb.TagNumber(6) + void clearConfluentCloud() => $_clearField(6); + @$pb.TagNumber(6) + IngestionDataSourceSettings_ConfluentCloud ensureConfluentCloud() => + $_ensure(5); +} + +/// Settings for Platform Logs produced by Pub/Sub. +class PlatformLogsSettings extends $pb.GeneratedMessage { + factory PlatformLogsSettings({ + PlatformLogsSettings_Severity? severity, + }) { + final $result = create(); + if (severity != null) { + $result.severity = severity; + } + return $result; + } + PlatformLogsSettings._() : super(); + factory PlatformLogsSettings.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PlatformLogsSettings.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PlatformLogsSettings', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..e( + 1, _omitFieldNames ? '' : 'severity', $pb.PbFieldType.OE, + defaultOrMaker: PlatformLogsSettings_Severity.SEVERITY_UNSPECIFIED, + valueOf: PlatformLogsSettings_Severity.valueOf, + enumValues: PlatformLogsSettings_Severity.values) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PlatformLogsSettings clone() => + PlatformLogsSettings()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PlatformLogsSettings copyWith(void Function(PlatformLogsSettings) updates) => + super.copyWith((message) => updates(message as PlatformLogsSettings)) + as PlatformLogsSettings; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PlatformLogsSettings create() => PlatformLogsSettings._(); + PlatformLogsSettings createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PlatformLogsSettings getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PlatformLogsSettings? _defaultInstance; + + /// Optional. The minimum severity level of Platform Logs that will be written. + @$pb.TagNumber(1) + PlatformLogsSettings_Severity get severity => $_getN(0); + @$pb.TagNumber(1) + set severity(PlatformLogsSettings_Severity v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasSeverity() => $_has(0); + @$pb.TagNumber(1) + void clearSeverity() => $_clearField(1); +} + +/// Specifies the reason why some data may have been left out of +/// the desired Pub/Sub message due to the API message limits +/// (https://cloud.google.com/pubsub/quotas#resource_limits). For example, +/// when the number of attributes is larger than 100, the number of +/// attributes is truncated to 100 to respect the limit on the attribute count. +/// Other attribute limits are treated similarly. When the size of the desired +/// message would've been larger than 10MB, the message won't be published at +/// all, and ingestion of the subsequent messages will proceed as normal. +class IngestionFailureEvent_ApiViolationReason extends $pb.GeneratedMessage { + factory IngestionFailureEvent_ApiViolationReason() => create(); + IngestionFailureEvent_ApiViolationReason._() : super(); + factory IngestionFailureEvent_ApiViolationReason.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_ApiViolationReason.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionFailureEvent.ApiViolationReason', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_ApiViolationReason clone() => + IngestionFailureEvent_ApiViolationReason()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_ApiViolationReason copyWith( + void Function(IngestionFailureEvent_ApiViolationReason) updates) => + super.copyWith((message) => + updates(message as IngestionFailureEvent_ApiViolationReason)) + as IngestionFailureEvent_ApiViolationReason; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_ApiViolationReason create() => + IngestionFailureEvent_ApiViolationReason._(); + IngestionFailureEvent_ApiViolationReason createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_ApiViolationReason getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_ApiViolationReason>(create); + static IngestionFailureEvent_ApiViolationReason? _defaultInstance; +} + +/// Set when an Avro file is unsupported or its format is not valid. When this +/// occurs, one or more Avro objects won't be ingested. +class IngestionFailureEvent_AvroFailureReason extends $pb.GeneratedMessage { + factory IngestionFailureEvent_AvroFailureReason() => create(); + IngestionFailureEvent_AvroFailureReason._() : super(); + factory IngestionFailureEvent_AvroFailureReason.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_AvroFailureReason.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionFailureEvent.AvroFailureReason', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_AvroFailureReason clone() => + IngestionFailureEvent_AvroFailureReason()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_AvroFailureReason copyWith( + void Function(IngestionFailureEvent_AvroFailureReason) updates) => + super.copyWith((message) => + updates(message as IngestionFailureEvent_AvroFailureReason)) + as IngestionFailureEvent_AvroFailureReason; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_AvroFailureReason create() => + IngestionFailureEvent_AvroFailureReason._(); + IngestionFailureEvent_AvroFailureReason createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_AvroFailureReason getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_AvroFailureReason>(create); + static IngestionFailureEvent_AvroFailureReason? _defaultInstance; +} + +/// Set when a Pub/Sub message fails to get published due to a schema +/// validation violation. +class IngestionFailureEvent_SchemaViolationReason extends $pb.GeneratedMessage { + factory IngestionFailureEvent_SchemaViolationReason() => create(); + IngestionFailureEvent_SchemaViolationReason._() : super(); + factory IngestionFailureEvent_SchemaViolationReason.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_SchemaViolationReason.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionFailureEvent.SchemaViolationReason', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_SchemaViolationReason clone() => + IngestionFailureEvent_SchemaViolationReason()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_SchemaViolationReason copyWith( + void Function(IngestionFailureEvent_SchemaViolationReason) updates) => + super.copyWith((message) => + updates(message as IngestionFailureEvent_SchemaViolationReason)) + as IngestionFailureEvent_SchemaViolationReason; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_SchemaViolationReason create() => + IngestionFailureEvent_SchemaViolationReason._(); + IngestionFailureEvent_SchemaViolationReason createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_SchemaViolationReason getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_SchemaViolationReason>(create); + static IngestionFailureEvent_SchemaViolationReason? _defaultInstance; +} + +/// Set when a Pub/Sub message fails to get published due to a message +/// transformation error. +class IngestionFailureEvent_MessageTransformationFailureReason + extends $pb.GeneratedMessage { + factory IngestionFailureEvent_MessageTransformationFailureReason() => + create(); + IngestionFailureEvent_MessageTransformationFailureReason._() : super(); + factory IngestionFailureEvent_MessageTransformationFailureReason.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_MessageTransformationFailureReason.fromJson( + $core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames + ? '' + : 'IngestionFailureEvent.MessageTransformationFailureReason', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_MessageTransformationFailureReason clone() => + IngestionFailureEvent_MessageTransformationFailureReason() + ..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_MessageTransformationFailureReason copyWith( + void Function( + IngestionFailureEvent_MessageTransformationFailureReason) + updates) => + super.copyWith((message) => updates(message + as IngestionFailureEvent_MessageTransformationFailureReason)) + as IngestionFailureEvent_MessageTransformationFailureReason; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_MessageTransformationFailureReason create() => + IngestionFailureEvent_MessageTransformationFailureReason._(); + IngestionFailureEvent_MessageTransformationFailureReason + createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => $pb.PbList< + IngestionFailureEvent_MessageTransformationFailureReason>(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_MessageTransformationFailureReason + getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_MessageTransformationFailureReason>(create); + static IngestionFailureEvent_MessageTransformationFailureReason? + _defaultInstance; +} + +enum IngestionFailureEvent_CloudStorageFailure_Reason { + avroFailureReason, + apiViolationReason, + schemaViolationReason, + messageTransformationFailureReason, + notSet +} + +/// Failure when ingesting from a Cloud Storage source. +class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { + factory IngestionFailureEvent_CloudStorageFailure({ + $core.String? bucket, + $core.String? objectName, + $fixnum.Int64? objectGeneration, + IngestionFailureEvent_AvroFailureReason? avroFailureReason, + IngestionFailureEvent_ApiViolationReason? apiViolationReason, + IngestionFailureEvent_SchemaViolationReason? schemaViolationReason, + IngestionFailureEvent_MessageTransformationFailureReason? + messageTransformationFailureReason, + }) { + final $result = create(); + if (bucket != null) { + $result.bucket = bucket; + } + if (objectName != null) { + $result.objectName = objectName; + } + if (objectGeneration != null) { + $result.objectGeneration = objectGeneration; + } + if (avroFailureReason != null) { + $result.avroFailureReason = avroFailureReason; + } + if (apiViolationReason != null) { + $result.apiViolationReason = apiViolationReason; + } + if (schemaViolationReason != null) { + $result.schemaViolationReason = schemaViolationReason; + } + if (messageTransformationFailureReason != null) { + $result.messageTransformationFailureReason = + messageTransformationFailureReason; + } + return $result; + } + IngestionFailureEvent_CloudStorageFailure._() : super(); + factory IngestionFailureEvent_CloudStorageFailure.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_CloudStorageFailure.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core + .Map<$core.int, IngestionFailureEvent_CloudStorageFailure_Reason> + _IngestionFailureEvent_CloudStorageFailure_ReasonByTag = { + 5: IngestionFailureEvent_CloudStorageFailure_Reason.avroFailureReason, + 6: IngestionFailureEvent_CloudStorageFailure_Reason.apiViolationReason, + 7: IngestionFailureEvent_CloudStorageFailure_Reason.schemaViolationReason, + 8: IngestionFailureEvent_CloudStorageFailure_Reason + .messageTransformationFailureReason, + 0: IngestionFailureEvent_CloudStorageFailure_Reason.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionFailureEvent.CloudStorageFailure', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [5, 6, 7, 8]) + ..aOS(1, _omitFieldNames ? '' : 'bucket') + ..aOS(2, _omitFieldNames ? '' : 'objectName') + ..aInt64(3, _omitFieldNames ? '' : 'objectGeneration') + ..aOM( + 5, _omitFieldNames ? '' : 'avroFailureReason', + subBuilder: IngestionFailureEvent_AvroFailureReason.create) + ..aOM( + 6, _omitFieldNames ? '' : 'apiViolationReason', + subBuilder: IngestionFailureEvent_ApiViolationReason.create) + ..aOM( + 7, _omitFieldNames ? '' : 'schemaViolationReason', + subBuilder: IngestionFailureEvent_SchemaViolationReason.create) + ..aOM( + 8, _omitFieldNames ? '' : 'messageTransformationFailureReason', + subBuilder: + IngestionFailureEvent_MessageTransformationFailureReason.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_CloudStorageFailure clone() => + IngestionFailureEvent_CloudStorageFailure()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_CloudStorageFailure copyWith( + void Function(IngestionFailureEvent_CloudStorageFailure) updates) => + super.copyWith((message) => + updates(message as IngestionFailureEvent_CloudStorageFailure)) + as IngestionFailureEvent_CloudStorageFailure; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_CloudStorageFailure create() => + IngestionFailureEvent_CloudStorageFailure._(); + IngestionFailureEvent_CloudStorageFailure createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_CloudStorageFailure getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_CloudStorageFailure>(create); + static IngestionFailureEvent_CloudStorageFailure? _defaultInstance; + + IngestionFailureEvent_CloudStorageFailure_Reason whichReason() => + _IngestionFailureEvent_CloudStorageFailure_ReasonByTag[$_whichOneof(0)]!; + void clearReason() => $_clearField($_whichOneof(0)); + + /// Optional. Name of the Cloud Storage bucket used for ingestion. + @$pb.TagNumber(1) + $core.String get bucket => $_getSZ(0); + @$pb.TagNumber(1) + set bucket($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasBucket() => $_has(0); + @$pb.TagNumber(1) + void clearBucket() => $_clearField(1); + + /// Optional. Name of the Cloud Storage object which contained the section + /// that couldn't be ingested. + @$pb.TagNumber(2) + $core.String get objectName => $_getSZ(1); + @$pb.TagNumber(2) + set objectName($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasObjectName() => $_has(1); + @$pb.TagNumber(2) + void clearObjectName() => $_clearField(2); + + /// Optional. Generation of the Cloud Storage object which contained the + /// section that couldn't be ingested. + @$pb.TagNumber(3) + $fixnum.Int64 get objectGeneration => $_getI64(2); + @$pb.TagNumber(3) + set objectGeneration($fixnum.Int64 v) { + $_setInt64(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasObjectGeneration() => $_has(2); + @$pb.TagNumber(3) + void clearObjectGeneration() => $_clearField(3); + + /// Optional. Failure encountered when parsing an Avro file. + @$pb.TagNumber(5) + IngestionFailureEvent_AvroFailureReason get avroFailureReason => $_getN(3); + @$pb.TagNumber(5) + set avroFailureReason(IngestionFailureEvent_AvroFailureReason v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasAvroFailureReason() => $_has(3); + @$pb.TagNumber(5) + void clearAvroFailureReason() => $_clearField(5); + @$pb.TagNumber(5) + IngestionFailureEvent_AvroFailureReason ensureAvroFailureReason() => + $_ensure(3); + + /// Optional. The Pub/Sub API limits prevented the desired message from + /// being published. + @$pb.TagNumber(6) + IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(4); + @$pb.TagNumber(6) + set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasApiViolationReason() => $_has(4); + @$pb.TagNumber(6) + void clearApiViolationReason() => $_clearField(6); + @$pb.TagNumber(6) + IngestionFailureEvent_ApiViolationReason ensureApiViolationReason() => + $_ensure(4); + + /// Optional. The Pub/Sub message failed schema validation. + @$pb.TagNumber(7) + IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => + $_getN(5); + @$pb.TagNumber(7) + set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { + $_setField(7, v); + } + + @$pb.TagNumber(7) + $core.bool hasSchemaViolationReason() => $_has(5); + @$pb.TagNumber(7) + void clearSchemaViolationReason() => $_clearField(7); + @$pb.TagNumber(7) + IngestionFailureEvent_SchemaViolationReason ensureSchemaViolationReason() => + $_ensure(5); + + /// Optional. Failure encountered when applying a message transformation to + /// the Pub/Sub message. + @$pb.TagNumber(8) + IngestionFailureEvent_MessageTransformationFailureReason + get messageTransformationFailureReason => $_getN(6); + @$pb.TagNumber(8) + set messageTransformationFailureReason( + IngestionFailureEvent_MessageTransformationFailureReason v) { + $_setField(8, v); + } + + @$pb.TagNumber(8) + $core.bool hasMessageTransformationFailureReason() => $_has(6); + @$pb.TagNumber(8) + void clearMessageTransformationFailureReason() => $_clearField(8); + @$pb.TagNumber(8) + IngestionFailureEvent_MessageTransformationFailureReason + ensureMessageTransformationFailureReason() => $_ensure(6); +} + +enum IngestionFailureEvent_AwsMskFailureReason_Reason { + apiViolationReason, + schemaViolationReason, + messageTransformationFailureReason, + notSet +} + +/// Failure when ingesting from an Amazon MSK source. +class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { + factory IngestionFailureEvent_AwsMskFailureReason({ + $core.String? clusterArn, + $core.String? kafkaTopic, + $fixnum.Int64? partitionId, + $fixnum.Int64? offset, + IngestionFailureEvent_ApiViolationReason? apiViolationReason, + IngestionFailureEvent_SchemaViolationReason? schemaViolationReason, + IngestionFailureEvent_MessageTransformationFailureReason? + messageTransformationFailureReason, + }) { + final $result = create(); + if (clusterArn != null) { + $result.clusterArn = clusterArn; + } + if (kafkaTopic != null) { + $result.kafkaTopic = kafkaTopic; + } + if (partitionId != null) { + $result.partitionId = partitionId; + } + if (offset != null) { + $result.offset = offset; + } + if (apiViolationReason != null) { + $result.apiViolationReason = apiViolationReason; + } + if (schemaViolationReason != null) { + $result.schemaViolationReason = schemaViolationReason; + } + if (messageTransformationFailureReason != null) { + $result.messageTransformationFailureReason = + messageTransformationFailureReason; + } + return $result; + } + IngestionFailureEvent_AwsMskFailureReason._() : super(); + factory IngestionFailureEvent_AwsMskFailureReason.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_AwsMskFailureReason.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core + .Map<$core.int, IngestionFailureEvent_AwsMskFailureReason_Reason> + _IngestionFailureEvent_AwsMskFailureReason_ReasonByTag = { + 5: IngestionFailureEvent_AwsMskFailureReason_Reason.apiViolationReason, + 6: IngestionFailureEvent_AwsMskFailureReason_Reason.schemaViolationReason, + 7: IngestionFailureEvent_AwsMskFailureReason_Reason + .messageTransformationFailureReason, + 0: IngestionFailureEvent_AwsMskFailureReason_Reason.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionFailureEvent.AwsMskFailureReason', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [5, 6, 7]) + ..aOS(1, _omitFieldNames ? '' : 'clusterArn') + ..aOS(2, _omitFieldNames ? '' : 'kafkaTopic') + ..aInt64(3, _omitFieldNames ? '' : 'partitionId') + ..aInt64(4, _omitFieldNames ? '' : 'offset') + ..aOM( + 5, _omitFieldNames ? '' : 'apiViolationReason', + subBuilder: IngestionFailureEvent_ApiViolationReason.create) + ..aOM( + 6, _omitFieldNames ? '' : 'schemaViolationReason', + subBuilder: IngestionFailureEvent_SchemaViolationReason.create) + ..aOM( + 7, _omitFieldNames ? '' : 'messageTransformationFailureReason', + subBuilder: + IngestionFailureEvent_MessageTransformationFailureReason.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_AwsMskFailureReason clone() => + IngestionFailureEvent_AwsMskFailureReason()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_AwsMskFailureReason copyWith( + void Function(IngestionFailureEvent_AwsMskFailureReason) updates) => + super.copyWith((message) => + updates(message as IngestionFailureEvent_AwsMskFailureReason)) + as IngestionFailureEvent_AwsMskFailureReason; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_AwsMskFailureReason create() => + IngestionFailureEvent_AwsMskFailureReason._(); + IngestionFailureEvent_AwsMskFailureReason createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_AwsMskFailureReason getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_AwsMskFailureReason>(create); + static IngestionFailureEvent_AwsMskFailureReason? _defaultInstance; + + IngestionFailureEvent_AwsMskFailureReason_Reason whichReason() => + _IngestionFailureEvent_AwsMskFailureReason_ReasonByTag[$_whichOneof(0)]!; + void clearReason() => $_clearField($_whichOneof(0)); + + /// Optional. The ARN of the cluster of the topic being ingested from. + @$pb.TagNumber(1) + $core.String get clusterArn => $_getSZ(0); + @$pb.TagNumber(1) + set clusterArn($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasClusterArn() => $_has(0); + @$pb.TagNumber(1) + void clearClusterArn() => $_clearField(1); + + /// Optional. The name of the Kafka topic being ingested from. + @$pb.TagNumber(2) + $core.String get kafkaTopic => $_getSZ(1); + @$pb.TagNumber(2) + set kafkaTopic($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasKafkaTopic() => $_has(1); + @$pb.TagNumber(2) + void clearKafkaTopic() => $_clearField(2); + + /// Optional. The partition ID of the message that failed to be ingested. + @$pb.TagNumber(3) + $fixnum.Int64 get partitionId => $_getI64(2); + @$pb.TagNumber(3) + set partitionId($fixnum.Int64 v) { + $_setInt64(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPartitionId() => $_has(2); + @$pb.TagNumber(3) + void clearPartitionId() => $_clearField(3); + + /// Optional. The offset within the partition of the message that failed to + /// be ingested. + @$pb.TagNumber(4) + $fixnum.Int64 get offset => $_getI64(3); + @$pb.TagNumber(4) + set offset($fixnum.Int64 v) { + $_setInt64(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasOffset() => $_has(3); + @$pb.TagNumber(4) + void clearOffset() => $_clearField(4); + + /// Optional. The Pub/Sub API limits prevented the desired message from + /// being published. + @$pb.TagNumber(5) + IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(4); + @$pb.TagNumber(5) + set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasApiViolationReason() => $_has(4); + @$pb.TagNumber(5) + void clearApiViolationReason() => $_clearField(5); + @$pb.TagNumber(5) + IngestionFailureEvent_ApiViolationReason ensureApiViolationReason() => + $_ensure(4); + + /// Optional. The Pub/Sub message failed schema validation. + @$pb.TagNumber(6) + IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => + $_getN(5); + @$pb.TagNumber(6) + set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasSchemaViolationReason() => $_has(5); + @$pb.TagNumber(6) + void clearSchemaViolationReason() => $_clearField(6); + @$pb.TagNumber(6) + IngestionFailureEvent_SchemaViolationReason ensureSchemaViolationReason() => + $_ensure(5); + + /// Optional. Failure encountered when applying a message transformation to + /// the Pub/Sub message. + @$pb.TagNumber(7) + IngestionFailureEvent_MessageTransformationFailureReason + get messageTransformationFailureReason => $_getN(6); + @$pb.TagNumber(7) + set messageTransformationFailureReason( + IngestionFailureEvent_MessageTransformationFailureReason v) { + $_setField(7, v); + } + + @$pb.TagNumber(7) + $core.bool hasMessageTransformationFailureReason() => $_has(6); + @$pb.TagNumber(7) + void clearMessageTransformationFailureReason() => $_clearField(7); + @$pb.TagNumber(7) + IngestionFailureEvent_MessageTransformationFailureReason + ensureMessageTransformationFailureReason() => $_ensure(6); +} + +enum IngestionFailureEvent_AzureEventHubsFailureReason_Reason { + apiViolationReason, + schemaViolationReason, + messageTransformationFailureReason, + notSet +} + +/// Failure when ingesting from an Azure Event Hubs source. +class IngestionFailureEvent_AzureEventHubsFailureReason + extends $pb.GeneratedMessage { + factory IngestionFailureEvent_AzureEventHubsFailureReason({ + $core.String? namespace, + $core.String? eventHub, + $fixnum.Int64? partitionId, + $fixnum.Int64? offset, + IngestionFailureEvent_ApiViolationReason? apiViolationReason, + IngestionFailureEvent_SchemaViolationReason? schemaViolationReason, + IngestionFailureEvent_MessageTransformationFailureReason? + messageTransformationFailureReason, + }) { + final $result = create(); + if (namespace != null) { + $result.namespace = namespace; + } + if (eventHub != null) { + $result.eventHub = eventHub; + } + if (partitionId != null) { + $result.partitionId = partitionId; + } + if (offset != null) { + $result.offset = offset; + } + if (apiViolationReason != null) { + $result.apiViolationReason = apiViolationReason; + } + if (schemaViolationReason != null) { + $result.schemaViolationReason = schemaViolationReason; + } + if (messageTransformationFailureReason != null) { + $result.messageTransformationFailureReason = + messageTransformationFailureReason; + } + return $result; + } + IngestionFailureEvent_AzureEventHubsFailureReason._() : super(); + factory IngestionFailureEvent_AzureEventHubsFailureReason.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_AzureEventHubsFailureReason.fromJson( + $core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core + .Map<$core.int, IngestionFailureEvent_AzureEventHubsFailureReason_Reason> + _IngestionFailureEvent_AzureEventHubsFailureReason_ReasonByTag = { + 5: IngestionFailureEvent_AzureEventHubsFailureReason_Reason + .apiViolationReason, + 6: IngestionFailureEvent_AzureEventHubsFailureReason_Reason + .schemaViolationReason, + 7: IngestionFailureEvent_AzureEventHubsFailureReason_Reason + .messageTransformationFailureReason, + 0: IngestionFailureEvent_AzureEventHubsFailureReason_Reason.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames + ? '' + : 'IngestionFailureEvent.AzureEventHubsFailureReason', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [5, 6, 7]) + ..aOS(1, _omitFieldNames ? '' : 'namespace') + ..aOS(2, _omitFieldNames ? '' : 'eventHub') + ..aInt64(3, _omitFieldNames ? '' : 'partitionId') + ..aInt64(4, _omitFieldNames ? '' : 'offset') + ..aOM( + 5, _omitFieldNames ? '' : 'apiViolationReason', + subBuilder: IngestionFailureEvent_ApiViolationReason.create) + ..aOM( + 6, _omitFieldNames ? '' : 'schemaViolationReason', + subBuilder: IngestionFailureEvent_SchemaViolationReason.create) + ..aOM( + 7, _omitFieldNames ? '' : 'messageTransformationFailureReason', + subBuilder: + IngestionFailureEvent_MessageTransformationFailureReason.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_AzureEventHubsFailureReason clone() => + IngestionFailureEvent_AzureEventHubsFailureReason() + ..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_AzureEventHubsFailureReason copyWith( + void Function(IngestionFailureEvent_AzureEventHubsFailureReason) + updates) => + super.copyWith((message) => updates( + message as IngestionFailureEvent_AzureEventHubsFailureReason)) + as IngestionFailureEvent_AzureEventHubsFailureReason; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_AzureEventHubsFailureReason create() => + IngestionFailureEvent_AzureEventHubsFailureReason._(); + IngestionFailureEvent_AzureEventHubsFailureReason createEmptyInstance() => + create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_AzureEventHubsFailureReason getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_AzureEventHubsFailureReason>(create); + static IngestionFailureEvent_AzureEventHubsFailureReason? _defaultInstance; + + IngestionFailureEvent_AzureEventHubsFailureReason_Reason whichReason() => + _IngestionFailureEvent_AzureEventHubsFailureReason_ReasonByTag[ + $_whichOneof(0)]!; + void clearReason() => $_clearField($_whichOneof(0)); + + /// Optional. The namespace containing the event hub being ingested from. + @$pb.TagNumber(1) + $core.String get namespace => $_getSZ(0); + @$pb.TagNumber(1) + set namespace($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasNamespace() => $_has(0); + @$pb.TagNumber(1) + void clearNamespace() => $_clearField(1); + + /// Optional. The name of the event hub being ingested from. + @$pb.TagNumber(2) + $core.String get eventHub => $_getSZ(1); + @$pb.TagNumber(2) + set eventHub($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasEventHub() => $_has(1); + @$pb.TagNumber(2) + void clearEventHub() => $_clearField(2); + + /// Optional. The partition ID of the message that failed to be ingested. + @$pb.TagNumber(3) + $fixnum.Int64 get partitionId => $_getI64(2); + @$pb.TagNumber(3) + set partitionId($fixnum.Int64 v) { + $_setInt64(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPartitionId() => $_has(2); + @$pb.TagNumber(3) + void clearPartitionId() => $_clearField(3); + + /// Optional. The offset within the partition of the message that failed to + /// be ingested. + @$pb.TagNumber(4) + $fixnum.Int64 get offset => $_getI64(3); + @$pb.TagNumber(4) + set offset($fixnum.Int64 v) { + $_setInt64(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasOffset() => $_has(3); + @$pb.TagNumber(4) + void clearOffset() => $_clearField(4); + + /// Optional. The Pub/Sub API limits prevented the desired message from + /// being published. + @$pb.TagNumber(5) + IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(4); + @$pb.TagNumber(5) + set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasApiViolationReason() => $_has(4); + @$pb.TagNumber(5) + void clearApiViolationReason() => $_clearField(5); + @$pb.TagNumber(5) + IngestionFailureEvent_ApiViolationReason ensureApiViolationReason() => + $_ensure(4); + + /// Optional. The Pub/Sub message failed schema validation. + @$pb.TagNumber(6) + IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => + $_getN(5); + @$pb.TagNumber(6) + set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasSchemaViolationReason() => $_has(5); + @$pb.TagNumber(6) + void clearSchemaViolationReason() => $_clearField(6); + @$pb.TagNumber(6) + IngestionFailureEvent_SchemaViolationReason ensureSchemaViolationReason() => + $_ensure(5); + + /// Optional. Failure encountered when applying a message transformation to + /// the Pub/Sub message. + @$pb.TagNumber(7) + IngestionFailureEvent_MessageTransformationFailureReason + get messageTransformationFailureReason => $_getN(6); + @$pb.TagNumber(7) + set messageTransformationFailureReason( + IngestionFailureEvent_MessageTransformationFailureReason v) { + $_setField(7, v); + } + + @$pb.TagNumber(7) + $core.bool hasMessageTransformationFailureReason() => $_has(6); + @$pb.TagNumber(7) + void clearMessageTransformationFailureReason() => $_clearField(7); + @$pb.TagNumber(7) + IngestionFailureEvent_MessageTransformationFailureReason + ensureMessageTransformationFailureReason() => $_ensure(6); +} + +enum IngestionFailureEvent_ConfluentCloudFailureReason_Reason { + apiViolationReason, + schemaViolationReason, + messageTransformationFailureReason, + notSet +} + +/// Failure when ingesting from a Confluent Cloud source. +class IngestionFailureEvent_ConfluentCloudFailureReason + extends $pb.GeneratedMessage { + factory IngestionFailureEvent_ConfluentCloudFailureReason({ + $core.String? clusterId, + $core.String? kafkaTopic, + $fixnum.Int64? partitionId, + $fixnum.Int64? offset, + IngestionFailureEvent_ApiViolationReason? apiViolationReason, + IngestionFailureEvent_SchemaViolationReason? schemaViolationReason, + IngestionFailureEvent_MessageTransformationFailureReason? + messageTransformationFailureReason, + }) { + final $result = create(); + if (clusterId != null) { + $result.clusterId = clusterId; + } + if (kafkaTopic != null) { + $result.kafkaTopic = kafkaTopic; + } + if (partitionId != null) { + $result.partitionId = partitionId; + } + if (offset != null) { + $result.offset = offset; + } + if (apiViolationReason != null) { + $result.apiViolationReason = apiViolationReason; + } + if (schemaViolationReason != null) { + $result.schemaViolationReason = schemaViolationReason; + } + if (messageTransformationFailureReason != null) { + $result.messageTransformationFailureReason = + messageTransformationFailureReason; + } + return $result; + } + IngestionFailureEvent_ConfluentCloudFailureReason._() : super(); + factory IngestionFailureEvent_ConfluentCloudFailureReason.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_ConfluentCloudFailureReason.fromJson( + $core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core + .Map<$core.int, IngestionFailureEvent_ConfluentCloudFailureReason_Reason> + _IngestionFailureEvent_ConfluentCloudFailureReason_ReasonByTag = { + 5: IngestionFailureEvent_ConfluentCloudFailureReason_Reason + .apiViolationReason, + 6: IngestionFailureEvent_ConfluentCloudFailureReason_Reason + .schemaViolationReason, + 7: IngestionFailureEvent_ConfluentCloudFailureReason_Reason + .messageTransformationFailureReason, + 0: IngestionFailureEvent_ConfluentCloudFailureReason_Reason.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames + ? '' + : 'IngestionFailureEvent.ConfluentCloudFailureReason', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [5, 6, 7]) + ..aOS(1, _omitFieldNames ? '' : 'clusterId') + ..aOS(2, _omitFieldNames ? '' : 'kafkaTopic') + ..aInt64(3, _omitFieldNames ? '' : 'partitionId') + ..aInt64(4, _omitFieldNames ? '' : 'offset') + ..aOM( + 5, _omitFieldNames ? '' : 'apiViolationReason', + subBuilder: IngestionFailureEvent_ApiViolationReason.create) + ..aOM( + 6, _omitFieldNames ? '' : 'schemaViolationReason', + subBuilder: IngestionFailureEvent_SchemaViolationReason.create) + ..aOM( + 7, _omitFieldNames ? '' : 'messageTransformationFailureReason', + subBuilder: + IngestionFailureEvent_MessageTransformationFailureReason.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_ConfluentCloudFailureReason clone() => + IngestionFailureEvent_ConfluentCloudFailureReason() + ..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_ConfluentCloudFailureReason copyWith( + void Function(IngestionFailureEvent_ConfluentCloudFailureReason) + updates) => + super.copyWith((message) => updates( + message as IngestionFailureEvent_ConfluentCloudFailureReason)) + as IngestionFailureEvent_ConfluentCloudFailureReason; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_ConfluentCloudFailureReason create() => + IngestionFailureEvent_ConfluentCloudFailureReason._(); + IngestionFailureEvent_ConfluentCloudFailureReason createEmptyInstance() => + create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_ConfluentCloudFailureReason getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_ConfluentCloudFailureReason>(create); + static IngestionFailureEvent_ConfluentCloudFailureReason? _defaultInstance; + + IngestionFailureEvent_ConfluentCloudFailureReason_Reason whichReason() => + _IngestionFailureEvent_ConfluentCloudFailureReason_ReasonByTag[ + $_whichOneof(0)]!; + void clearReason() => $_clearField($_whichOneof(0)); + + /// Optional. The cluster ID containing the topic being ingested from. + @$pb.TagNumber(1) + $core.String get clusterId => $_getSZ(0); + @$pb.TagNumber(1) + set clusterId($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasClusterId() => $_has(0); + @$pb.TagNumber(1) + void clearClusterId() => $_clearField(1); + + /// Optional. The name of the Kafka topic being ingested from. + @$pb.TagNumber(2) + $core.String get kafkaTopic => $_getSZ(1); + @$pb.TagNumber(2) + set kafkaTopic($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasKafkaTopic() => $_has(1); + @$pb.TagNumber(2) + void clearKafkaTopic() => $_clearField(2); + + /// Optional. The partition ID of the message that failed to be ingested. + @$pb.TagNumber(3) + $fixnum.Int64 get partitionId => $_getI64(2); + @$pb.TagNumber(3) + set partitionId($fixnum.Int64 v) { + $_setInt64(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPartitionId() => $_has(2); + @$pb.TagNumber(3) + void clearPartitionId() => $_clearField(3); + + /// Optional. The offset within the partition of the message that failed to + /// be ingested. + @$pb.TagNumber(4) + $fixnum.Int64 get offset => $_getI64(3); + @$pb.TagNumber(4) + set offset($fixnum.Int64 v) { + $_setInt64(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasOffset() => $_has(3); + @$pb.TagNumber(4) + void clearOffset() => $_clearField(4); + + /// Optional. The Pub/Sub API limits prevented the desired message from + /// being published. + @$pb.TagNumber(5) + IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(4); + @$pb.TagNumber(5) + set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasApiViolationReason() => $_has(4); + @$pb.TagNumber(5) + void clearApiViolationReason() => $_clearField(5); + @$pb.TagNumber(5) + IngestionFailureEvent_ApiViolationReason ensureApiViolationReason() => + $_ensure(4); + + /// Optional. The Pub/Sub message failed schema validation. + @$pb.TagNumber(6) + IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => + $_getN(5); + @$pb.TagNumber(6) + set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasSchemaViolationReason() => $_has(5); + @$pb.TagNumber(6) + void clearSchemaViolationReason() => $_clearField(6); + @$pb.TagNumber(6) + IngestionFailureEvent_SchemaViolationReason ensureSchemaViolationReason() => + $_ensure(5); + + /// Optional. Failure encountered when applying a message transformation to + /// the Pub/Sub message. + @$pb.TagNumber(7) + IngestionFailureEvent_MessageTransformationFailureReason + get messageTransformationFailureReason => $_getN(6); + @$pb.TagNumber(7) + set messageTransformationFailureReason( + IngestionFailureEvent_MessageTransformationFailureReason v) { + $_setField(7, v); + } + + @$pb.TagNumber(7) + $core.bool hasMessageTransformationFailureReason() => $_has(6); + @$pb.TagNumber(7) + void clearMessageTransformationFailureReason() => $_clearField(7); + @$pb.TagNumber(7) + IngestionFailureEvent_MessageTransformationFailureReason + ensureMessageTransformationFailureReason() => $_ensure(6); +} + +enum IngestionFailureEvent_AwsKinesisFailureReason_Reason { + schemaViolationReason, + messageTransformationFailureReason, + apiViolationReason, + notSet +} + +/// Failure when ingesting from an AWS Kinesis source. +class IngestionFailureEvent_AwsKinesisFailureReason + extends $pb.GeneratedMessage { + factory IngestionFailureEvent_AwsKinesisFailureReason({ + $core.String? streamArn, + $core.String? partitionKey, + $core.String? sequenceNumber, + IngestionFailureEvent_SchemaViolationReason? schemaViolationReason, + IngestionFailureEvent_MessageTransformationFailureReason? + messageTransformationFailureReason, + IngestionFailureEvent_ApiViolationReason? apiViolationReason, + }) { + final $result = create(); + if (streamArn != null) { + $result.streamArn = streamArn; + } + if (partitionKey != null) { + $result.partitionKey = partitionKey; + } + if (sequenceNumber != null) { + $result.sequenceNumber = sequenceNumber; + } + if (schemaViolationReason != null) { + $result.schemaViolationReason = schemaViolationReason; + } + if (messageTransformationFailureReason != null) { + $result.messageTransformationFailureReason = + messageTransformationFailureReason; + } + if (apiViolationReason != null) { + $result.apiViolationReason = apiViolationReason; + } + return $result; + } + IngestionFailureEvent_AwsKinesisFailureReason._() : super(); + factory IngestionFailureEvent_AwsKinesisFailureReason.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent_AwsKinesisFailureReason.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core + .Map<$core.int, IngestionFailureEvent_AwsKinesisFailureReason_Reason> + _IngestionFailureEvent_AwsKinesisFailureReason_ReasonByTag = { + 4: IngestionFailureEvent_AwsKinesisFailureReason_Reason + .schemaViolationReason, + 5: IngestionFailureEvent_AwsKinesisFailureReason_Reason + .messageTransformationFailureReason, + 6: IngestionFailureEvent_AwsKinesisFailureReason_Reason.apiViolationReason, + 0: IngestionFailureEvent_AwsKinesisFailureReason_Reason.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionFailureEvent.AwsKinesisFailureReason', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [4, 5, 6]) + ..aOS(1, _omitFieldNames ? '' : 'streamArn') + ..aOS(2, _omitFieldNames ? '' : 'partitionKey') + ..aOS(3, _omitFieldNames ? '' : 'sequenceNumber') + ..aOM( + 4, _omitFieldNames ? '' : 'schemaViolationReason', + subBuilder: IngestionFailureEvent_SchemaViolationReason.create) + ..aOM( + 5, _omitFieldNames ? '' : 'messageTransformationFailureReason', + subBuilder: + IngestionFailureEvent_MessageTransformationFailureReason.create) + ..aOM( + 6, _omitFieldNames ? '' : 'apiViolationReason', + subBuilder: IngestionFailureEvent_ApiViolationReason.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_AwsKinesisFailureReason clone() => + IngestionFailureEvent_AwsKinesisFailureReason()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent_AwsKinesisFailureReason copyWith( + void Function(IngestionFailureEvent_AwsKinesisFailureReason) + updates) => + super.copyWith((message) => + updates(message as IngestionFailureEvent_AwsKinesisFailureReason)) + as IngestionFailureEvent_AwsKinesisFailureReason; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_AwsKinesisFailureReason create() => + IngestionFailureEvent_AwsKinesisFailureReason._(); + IngestionFailureEvent_AwsKinesisFailureReason createEmptyInstance() => + create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent_AwsKinesisFailureReason getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + IngestionFailureEvent_AwsKinesisFailureReason>(create); + static IngestionFailureEvent_AwsKinesisFailureReason? _defaultInstance; + + IngestionFailureEvent_AwsKinesisFailureReason_Reason whichReason() => + _IngestionFailureEvent_AwsKinesisFailureReason_ReasonByTag[ + $_whichOneof(0)]!; + void clearReason() => $_clearField($_whichOneof(0)); + + /// Optional. The stream ARN of the Kinesis stream being ingested from. + @$pb.TagNumber(1) + $core.String get streamArn => $_getSZ(0); + @$pb.TagNumber(1) + set streamArn($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasStreamArn() => $_has(0); + @$pb.TagNumber(1) + void clearStreamArn() => $_clearField(1); + + /// Optional. The partition key of the message that failed to be ingested. + @$pb.TagNumber(2) + $core.String get partitionKey => $_getSZ(1); + @$pb.TagNumber(2) + set partitionKey($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPartitionKey() => $_has(1); + @$pb.TagNumber(2) + void clearPartitionKey() => $_clearField(2); + + /// Optional. The sequence number of the message that failed to be ingested. + @$pb.TagNumber(3) + $core.String get sequenceNumber => $_getSZ(2); + @$pb.TagNumber(3) + set sequenceNumber($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasSequenceNumber() => $_has(2); + @$pb.TagNumber(3) + void clearSequenceNumber() => $_clearField(3); + + /// Optional. The Pub/Sub message failed schema validation. + @$pb.TagNumber(4) + IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => + $_getN(3); + @$pb.TagNumber(4) + set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasSchemaViolationReason() => $_has(3); + @$pb.TagNumber(4) + void clearSchemaViolationReason() => $_clearField(4); + @$pb.TagNumber(4) + IngestionFailureEvent_SchemaViolationReason ensureSchemaViolationReason() => + $_ensure(3); + + /// Optional. Failure encountered when applying a message transformation to + /// the Pub/Sub message. + @$pb.TagNumber(5) + IngestionFailureEvent_MessageTransformationFailureReason + get messageTransformationFailureReason => $_getN(4); + @$pb.TagNumber(5) + set messageTransformationFailureReason( + IngestionFailureEvent_MessageTransformationFailureReason v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasMessageTransformationFailureReason() => $_has(4); + @$pb.TagNumber(5) + void clearMessageTransformationFailureReason() => $_clearField(5); + @$pb.TagNumber(5) + IngestionFailureEvent_MessageTransformationFailureReason + ensureMessageTransformationFailureReason() => $_ensure(4); + + /// Optional. The message failed to be published due to an API violation. + /// This is only set when the size of the data field of the Kinesis record + /// is zero. + @$pb.TagNumber(6) + IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(5); + @$pb.TagNumber(6) + set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasApiViolationReason() => $_has(5); + @$pb.TagNumber(6) + void clearApiViolationReason() => $_clearField(6); + @$pb.TagNumber(6) + IngestionFailureEvent_ApiViolationReason ensureApiViolationReason() => + $_ensure(5); +} + +enum IngestionFailureEvent_Failure { + cloudStorageFailure, + awsMskFailure, + azureEventHubsFailure, + confluentCloudFailure, + awsKinesisFailure, + notSet +} + +/// Payload of the Platform Log entry sent when a failure is encountered while +/// ingesting. +class IngestionFailureEvent extends $pb.GeneratedMessage { + factory IngestionFailureEvent({ + $core.String? topic, + $core.String? errorMessage, + IngestionFailureEvent_CloudStorageFailure? cloudStorageFailure, + IngestionFailureEvent_AwsMskFailureReason? awsMskFailure, + IngestionFailureEvent_AzureEventHubsFailureReason? azureEventHubsFailure, + IngestionFailureEvent_ConfluentCloudFailureReason? confluentCloudFailure, + IngestionFailureEvent_AwsKinesisFailureReason? awsKinesisFailure, + }) { + final $result = create(); + if (topic != null) { + $result.topic = topic; + } + if (errorMessage != null) { + $result.errorMessage = errorMessage; + } + if (cloudStorageFailure != null) { + $result.cloudStorageFailure = cloudStorageFailure; + } + if (awsMskFailure != null) { + $result.awsMskFailure = awsMskFailure; + } + if (azureEventHubsFailure != null) { + $result.azureEventHubsFailure = azureEventHubsFailure; + } + if (confluentCloudFailure != null) { + $result.confluentCloudFailure = confluentCloudFailure; + } + if (awsKinesisFailure != null) { + $result.awsKinesisFailure = awsKinesisFailure; + } + return $result; + } + IngestionFailureEvent._() : super(); + factory IngestionFailureEvent.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory IngestionFailureEvent.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, IngestionFailureEvent_Failure> + _IngestionFailureEvent_FailureByTag = { + 3: IngestionFailureEvent_Failure.cloudStorageFailure, + 4: IngestionFailureEvent_Failure.awsMskFailure, + 5: IngestionFailureEvent_Failure.azureEventHubsFailure, + 6: IngestionFailureEvent_Failure.confluentCloudFailure, + 7: IngestionFailureEvent_Failure.awsKinesisFailure, + 0: IngestionFailureEvent_Failure.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IngestionFailureEvent', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [3, 4, 5, 6, 7]) + ..aOS(1, _omitFieldNames ? '' : 'topic') + ..aOS(2, _omitFieldNames ? '' : 'errorMessage') + ..aOM( + 3, _omitFieldNames ? '' : 'cloudStorageFailure', + subBuilder: IngestionFailureEvent_CloudStorageFailure.create) + ..aOM( + 4, _omitFieldNames ? '' : 'awsMskFailure', + subBuilder: IngestionFailureEvent_AwsMskFailureReason.create) + ..aOM( + 5, _omitFieldNames ? '' : 'azureEventHubsFailure', + subBuilder: IngestionFailureEvent_AzureEventHubsFailureReason.create) + ..aOM( + 6, _omitFieldNames ? '' : 'confluentCloudFailure', + subBuilder: IngestionFailureEvent_ConfluentCloudFailureReason.create) + ..aOM( + 7, _omitFieldNames ? '' : 'awsKinesisFailure', + subBuilder: IngestionFailureEvent_AwsKinesisFailureReason.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent clone() => + IngestionFailureEvent()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IngestionFailureEvent copyWith( + void Function(IngestionFailureEvent) updates) => + super.copyWith((message) => updates(message as IngestionFailureEvent)) + as IngestionFailureEvent; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent create() => IngestionFailureEvent._(); + IngestionFailureEvent createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IngestionFailureEvent getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static IngestionFailureEvent? _defaultInstance; + + IngestionFailureEvent_Failure whichFailure() => + _IngestionFailureEvent_FailureByTag[$_whichOneof(0)]!; + void clearFailure() => $_clearField($_whichOneof(0)); + + /// Required. Name of the import topic. Format is: + /// projects/{project_name}/topics/{topic_name}. + @$pb.TagNumber(1) + $core.String get topic => $_getSZ(0); + @$pb.TagNumber(1) + set topic($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTopic() => $_has(0); + @$pb.TagNumber(1) + void clearTopic() => $_clearField(1); + + /// Required. Error details explaining why ingestion to Pub/Sub has failed. + @$pb.TagNumber(2) + $core.String get errorMessage => $_getSZ(1); + @$pb.TagNumber(2) + set errorMessage($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasErrorMessage() => $_has(1); + @$pb.TagNumber(2) + void clearErrorMessage() => $_clearField(2); + + /// Optional. Failure when ingesting from Cloud Storage. + @$pb.TagNumber(3) + IngestionFailureEvent_CloudStorageFailure get cloudStorageFailure => + $_getN(2); + @$pb.TagNumber(3) + set cloudStorageFailure(IngestionFailureEvent_CloudStorageFailure v) { + $_setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasCloudStorageFailure() => $_has(2); + @$pb.TagNumber(3) + void clearCloudStorageFailure() => $_clearField(3); + @$pb.TagNumber(3) + IngestionFailureEvent_CloudStorageFailure ensureCloudStorageFailure() => + $_ensure(2); + + /// Optional. Failure when ingesting from Amazon MSK. + @$pb.TagNumber(4) + IngestionFailureEvent_AwsMskFailureReason get awsMskFailure => $_getN(3); + @$pb.TagNumber(4) + set awsMskFailure(IngestionFailureEvent_AwsMskFailureReason v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasAwsMskFailure() => $_has(3); + @$pb.TagNumber(4) + void clearAwsMskFailure() => $_clearField(4); + @$pb.TagNumber(4) + IngestionFailureEvent_AwsMskFailureReason ensureAwsMskFailure() => + $_ensure(3); + + /// Optional. Failure when ingesting from Azure Event Hubs. + @$pb.TagNumber(5) + IngestionFailureEvent_AzureEventHubsFailureReason get azureEventHubsFailure => + $_getN(4); + @$pb.TagNumber(5) + set azureEventHubsFailure( + IngestionFailureEvent_AzureEventHubsFailureReason v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasAzureEventHubsFailure() => $_has(4); + @$pb.TagNumber(5) + void clearAzureEventHubsFailure() => $_clearField(5); + @$pb.TagNumber(5) + IngestionFailureEvent_AzureEventHubsFailureReason + ensureAzureEventHubsFailure() => $_ensure(4); + + /// Optional. Failure when ingesting from Confluent Cloud. + @$pb.TagNumber(6) + IngestionFailureEvent_ConfluentCloudFailureReason get confluentCloudFailure => + $_getN(5); + @$pb.TagNumber(6) + set confluentCloudFailure( + IngestionFailureEvent_ConfluentCloudFailureReason v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasConfluentCloudFailure() => $_has(5); + @$pb.TagNumber(6) + void clearConfluentCloudFailure() => $_clearField(6); + @$pb.TagNumber(6) + IngestionFailureEvent_ConfluentCloudFailureReason + ensureConfluentCloudFailure() => $_ensure(5); + + /// Optional. Failure when ingesting from AWS Kinesis. + @$pb.TagNumber(7) + IngestionFailureEvent_AwsKinesisFailureReason get awsKinesisFailure => + $_getN(6); + @$pb.TagNumber(7) + set awsKinesisFailure(IngestionFailureEvent_AwsKinesisFailureReason v) { + $_setField(7, v); + } + + @$pb.TagNumber(7) + $core.bool hasAwsKinesisFailure() => $_has(6); + @$pb.TagNumber(7) + void clearAwsKinesisFailure() => $_clearField(7); + @$pb.TagNumber(7) + IngestionFailureEvent_AwsKinesisFailureReason ensureAwsKinesisFailure() => + $_ensure(6); +} + +/// User-defined JavaScript function that can transform or filter a Pub/Sub +/// message. +class JavaScriptUDF extends $pb.GeneratedMessage { + factory JavaScriptUDF({ + $core.String? functionName, + $core.String? code, + }) { + final $result = create(); + if (functionName != null) { + $result.functionName = functionName; + } + if (code != null) { + $result.code = code; + } + return $result; + } + JavaScriptUDF._() : super(); + factory JavaScriptUDF.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory JavaScriptUDF.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'JavaScriptUDF', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'functionName') + ..aOS(2, _omitFieldNames ? '' : 'code') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + JavaScriptUDF clone() => JavaScriptUDF()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + JavaScriptUDF copyWith(void Function(JavaScriptUDF) updates) => + super.copyWith((message) => updates(message as JavaScriptUDF)) + as JavaScriptUDF; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static JavaScriptUDF create() => JavaScriptUDF._(); + JavaScriptUDF createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static JavaScriptUDF getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static JavaScriptUDF? _defaultInstance; + + /// Required. Name of the JavasScript function that should applied to Pub/Sub + /// messages. + @$pb.TagNumber(1) + $core.String get functionName => $_getSZ(0); + @$pb.TagNumber(1) + set functionName($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasFunctionName() => $_has(0); + @$pb.TagNumber(1) + void clearFunctionName() => $_clearField(1); + + /// Required. JavaScript code that contains a function `function_name` with the + /// below signature: + /// + /// ``` + /// /** + /// * Transforms a Pub/Sub message. + /// + /// * @return {(Object)>|null)} - To + /// * filter a message, return `null`. To transform a message return a map + /// * with the following keys: + /// * - (required) 'data' : {string} + /// * - (optional) 'attributes' : {Object} + /// * Returning empty `attributes` will remove all attributes from the + /// * message. + /// * + /// * @param {(Object)>} Pub/Sub + /// * message. Keys: + /// * - (required) 'data' : {string} + /// * - (required) 'attributes' : {Object} + /// * + /// * @param {Object} metadata - Pub/Sub message metadata. + /// * Keys: + /// * - (optional) 'message_id' : {string} + /// * - (optional) 'publish_time': {string} YYYY-MM-DDTHH:MM:SSZ format + /// * - (optional) 'ordering_key': {string} + /// */ + /// + /// function (message, metadata) { + /// } + /// ``` + @$pb.TagNumber(2) + $core.String get code => $_getSZ(1); + @$pb.TagNumber(2) + set code($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasCode() => $_has(1); + @$pb.TagNumber(2) + void clearCode() => $_clearField(2); +} + +/// Configuration for making inferences using arbitrary JSON payloads. +class AIInference_UnstructuredInference extends $pb.GeneratedMessage { + factory AIInference_UnstructuredInference({ + $4.Struct? parameters, + }) { + final $result = create(); + if (parameters != null) { + $result.parameters = parameters; + } + return $result; + } + AIInference_UnstructuredInference._() : super(); + factory AIInference_UnstructuredInference.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory AIInference_UnstructuredInference.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'AIInference.UnstructuredInference', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOM<$4.Struct>(1, _omitFieldNames ? '' : 'parameters', + subBuilder: $4.Struct.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AIInference_UnstructuredInference clone() => + AIInference_UnstructuredInference()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AIInference_UnstructuredInference copyWith( + void Function(AIInference_UnstructuredInference) updates) => + super.copyWith((message) => + updates(message as AIInference_UnstructuredInference)) + as AIInference_UnstructuredInference; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static AIInference_UnstructuredInference create() => + AIInference_UnstructuredInference._(); + AIInference_UnstructuredInference createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static AIInference_UnstructuredInference getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor( + create); + static AIInference_UnstructuredInference? _defaultInstance; + + /// Optional. A parameters object to be included in each inference request. + /// The parameters object is combined with the data field of the Pub/Sub + /// message to form the inference request. + @$pb.TagNumber(1) + $4.Struct get parameters => $_getN(0); + @$pb.TagNumber(1) + set parameters($4.Struct v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasParameters() => $_has(0); + @$pb.TagNumber(1) + void clearParameters() => $_clearField(1); + @$pb.TagNumber(1) + $4.Struct ensureParameters() => $_ensure(0); +} + +enum AIInference_InferenceMode { unstructuredInference, notSet } + +/// Configuration for making inference requests against Vertex AI models. +class AIInference extends $pb.GeneratedMessage { + factory AIInference({ + $core.String? endpoint, + AIInference_UnstructuredInference? unstructuredInference, + $core.String? serviceAccountEmail, + }) { + final $result = create(); + if (endpoint != null) { + $result.endpoint = endpoint; + } + if (unstructuredInference != null) { + $result.unstructuredInference = unstructuredInference; + } + if (serviceAccountEmail != null) { + $result.serviceAccountEmail = serviceAccountEmail; + } + return $result; + } + AIInference._() : super(); + factory AIInference.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory AIInference.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, AIInference_InferenceMode> + _AIInference_InferenceModeByTag = { + 2: AIInference_InferenceMode.unstructuredInference, + 0: AIInference_InferenceMode.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'AIInference', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [2]) + ..aOS(1, _omitFieldNames ? '' : 'endpoint') + ..aOM( + 2, _omitFieldNames ? '' : 'unstructuredInference', + subBuilder: AIInference_UnstructuredInference.create) + ..aOS(3, _omitFieldNames ? '' : 'serviceAccountEmail') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AIInference clone() => AIInference()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AIInference copyWith(void Function(AIInference) updates) => + super.copyWith((message) => updates(message as AIInference)) + as AIInference; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static AIInference create() => AIInference._(); + AIInference createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static AIInference getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static AIInference? _defaultInstance; + + AIInference_InferenceMode whichInferenceMode() => + _AIInference_InferenceModeByTag[$_whichOneof(0)]!; + void clearInferenceMode() => $_clearField($_whichOneof(0)); + + /// Required. An endpoint to a Vertex AI model of the form + /// `projects/{project}/locations/{location}/endpoints/{endpoint}` or + /// `projects/{project}/locations/{location}/publishers/{publisher}/models/{model}`. + /// Vertex AI API requests will be sent to this endpoint. + @$pb.TagNumber(1) + $core.String get endpoint => $_getSZ(0); + @$pb.TagNumber(1) + set endpoint($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasEndpoint() => $_has(0); + @$pb.TagNumber(1) + void clearEndpoint() => $_clearField(1); + + /// Optional. Requests and responses can be any arbitrary JSON object. + @$pb.TagNumber(2) + AIInference_UnstructuredInference get unstructuredInference => $_getN(1); + @$pb.TagNumber(2) + set unstructuredInference(AIInference_UnstructuredInference v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasUnstructuredInference() => $_has(1); + @$pb.TagNumber(2) + void clearUnstructuredInference() => $_clearField(2); + @$pb.TagNumber(2) + AIInference_UnstructuredInference ensureUnstructuredInference() => + $_ensure(1); + + /// Optional. The service account to use to make prediction requests against + /// endpoints. The resource creator or updater that specifies this field must + /// have `iam.serviceAccounts.actAs` permission on the service account. If not + /// specified, the Pub/Sub [service + /// agent](https://cloud.google.com/iam/docs/service-agents), + /// service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used. + @$pb.TagNumber(3) + $core.String get serviceAccountEmail => $_getSZ(2); + @$pb.TagNumber(3) + set serviceAccountEmail($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasServiceAccountEmail() => $_has(2); + @$pb.TagNumber(3) + void clearServiceAccountEmail() => $_clearField(3); +} + +enum MessageTransform_Transform { javascriptUdf, aiInference, notSet } + +/// All supported message transforms types. +class MessageTransform extends $pb.GeneratedMessage { + factory MessageTransform({ + JavaScriptUDF? javascriptUdf, + @$core.Deprecated('This field is deprecated.') $core.bool? enabled, + $core.bool? disabled, + AIInference? aiInference, + }) { + final $result = create(); + if (javascriptUdf != null) { + $result.javascriptUdf = javascriptUdf; + } + if (enabled != null) { + // ignore: deprecated_member_use_from_same_package + $result.enabled = enabled; + } + if (disabled != null) { + $result.disabled = disabled; + } + if (aiInference != null) { + $result.aiInference = aiInference; + } + return $result; + } + MessageTransform._() : super(); + factory MessageTransform.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory MessageTransform.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, MessageTransform_Transform> + _MessageTransform_TransformByTag = { + 2: MessageTransform_Transform.javascriptUdf, + 6: MessageTransform_Transform.aiInference, + 0: MessageTransform_Transform.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'MessageTransform', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [2, 6]) + ..aOM(2, _omitFieldNames ? '' : 'javascriptUdf', + subBuilder: JavaScriptUDF.create) + ..aOB(3, _omitFieldNames ? '' : 'enabled') + ..aOB(4, _omitFieldNames ? '' : 'disabled') + ..aOM(6, _omitFieldNames ? '' : 'aiInference', + subBuilder: AIInference.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + MessageTransform clone() => MessageTransform()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + MessageTransform copyWith(void Function(MessageTransform) updates) => + super.copyWith((message) => updates(message as MessageTransform)) + as MessageTransform; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static MessageTransform create() => MessageTransform._(); + MessageTransform createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static MessageTransform getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static MessageTransform? _defaultInstance; + + MessageTransform_Transform whichTransform() => + _MessageTransform_TransformByTag[$_whichOneof(0)]!; + void clearTransform() => $_clearField($_whichOneof(0)); + + /// Optional. JavaScript User Defined Function. If multiple JavaScriptUDF's + /// are specified on a resource, each must have a unique `function_name`. + @$pb.TagNumber(2) + JavaScriptUDF get javascriptUdf => $_getN(0); + @$pb.TagNumber(2) + set javascriptUdf(JavaScriptUDF v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasJavascriptUdf() => $_has(0); + @$pb.TagNumber(2) + void clearJavascriptUdf() => $_clearField(2); + @$pb.TagNumber(2) + JavaScriptUDF ensureJavascriptUdf() => $_ensure(0); + + /// Optional. This field is deprecated, use the `disabled` field to disable + /// transforms. + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(3) + $core.bool get enabled => $_getBF(1); + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(3) + set enabled($core.bool v) { + $_setBool(1, v); + } + + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(3) + $core.bool hasEnabled() => $_has(1); + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(3) + void clearEnabled() => $_clearField(3); + + /// Optional. If true, the transform is disabled and will not be applied to + /// messages. Defaults to `false`. + @$pb.TagNumber(4) + $core.bool get disabled => $_getBF(2); + @$pb.TagNumber(4) + set disabled($core.bool v) { + $_setBool(2, v); + } + + @$pb.TagNumber(4) + $core.bool hasDisabled() => $_has(2); + @$pb.TagNumber(4) + void clearDisabled() => $_clearField(4); + + /// Optional. AI Inference. Specifies the Vertex AI endpoint that inference + /// requests built from the Pub/Sub message data and provided parameters will + /// be sent to. + @$pb.TagNumber(6) + AIInference get aiInference => $_getN(3); + @$pb.TagNumber(6) + set aiInference(AIInference v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasAiInference() => $_has(3); + @$pb.TagNumber(6) + void clearAiInference() => $_clearField(6); + @$pb.TagNumber(6) + AIInference ensureAiInference() => $_ensure(3); +} + +/// A topic resource. +class Topic extends $pb.GeneratedMessage { + factory Topic({ + $core.String? name, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? labels, + MessageStoragePolicy? messageStoragePolicy, + $core.String? kmsKeyName, + SchemaSettings? schemaSettings, + $core.bool? satisfiesPzs, + $5.Duration? messageRetentionDuration, + Topic_State? state, + IngestionDataSourceSettings? ingestionDataSourceSettings, + $core.Iterable? messageTransforms, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? tags, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (labels != null) { + $result.labels.addEntries(labels); + } + if (messageStoragePolicy != null) { + $result.messageStoragePolicy = messageStoragePolicy; + } + if (kmsKeyName != null) { + $result.kmsKeyName = kmsKeyName; + } + if (schemaSettings != null) { + $result.schemaSettings = schemaSettings; + } + if (satisfiesPzs != null) { + $result.satisfiesPzs = satisfiesPzs; + } + if (messageRetentionDuration != null) { + $result.messageRetentionDuration = messageRetentionDuration; + } + if (state != null) { + $result.state = state; + } + if (ingestionDataSourceSettings != null) { + $result.ingestionDataSourceSettings = ingestionDataSourceSettings; + } + if (messageTransforms != null) { + $result.messageTransforms.addAll(messageTransforms); + } + if (tags != null) { + $result.tags.addEntries(tags); + } + return $result; + } + Topic._() : super(); + factory Topic.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Topic.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Topic', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..m<$core.String, $core.String>(2, _omitFieldNames ? '' : 'labels', + entryClassName: 'Topic.LabelsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..aOM( + 3, _omitFieldNames ? '' : 'messageStoragePolicy', + subBuilder: MessageStoragePolicy.create) + ..aOS(5, _omitFieldNames ? '' : 'kmsKeyName') + ..aOM(6, _omitFieldNames ? '' : 'schemaSettings', + subBuilder: SchemaSettings.create) + ..aOB(7, _omitFieldNames ? '' : 'satisfiesPzs') + ..aOM<$5.Duration>(8, _omitFieldNames ? '' : 'messageRetentionDuration', + subBuilder: $5.Duration.create) + ..e(9, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: Topic_State.STATE_UNSPECIFIED, + valueOf: Topic_State.valueOf, + enumValues: Topic_State.values) + ..aOM( + 10, _omitFieldNames ? '' : 'ingestionDataSourceSettings', + subBuilder: IngestionDataSourceSettings.create) + ..pc( + 13, _omitFieldNames ? '' : 'messageTransforms', $pb.PbFieldType.PM, + subBuilder: MessageTransform.create) + ..m<$core.String, $core.String>(14, _omitFieldNames ? '' : 'tags', + entryClassName: 'Topic.TagsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Topic clone() => Topic()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Topic copyWith(void Function(Topic) updates) => + super.copyWith((message) => updates(message as Topic)) as Topic; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Topic create() => Topic._(); + Topic createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Topic getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Topic? _defaultInstance; + + /// Required. Identifier. The name of the topic. It must have the format + /// `"projects/{project}/topics/{topic}"`. `{topic}` must start with a letter, + /// and contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`), + /// underscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent + /// signs (`%`). It must be between 3 and 255 characters in length, and it + /// must not start with `"goog"`. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// Optional. See [Creating and managing labels] + /// (https://cloud.google.com/pubsub/docs/labels). + @$pb.TagNumber(2) + $pb.PbMap<$core.String, $core.String> get labels => $_getMap(1); + + /// Optional. Policy constraining the set of Google Cloud Platform regions + /// where messages published to the topic may be stored. If not present, then + /// no constraints are in effect. + @$pb.TagNumber(3) + MessageStoragePolicy get messageStoragePolicy => $_getN(2); + @$pb.TagNumber(3) + set messageStoragePolicy(MessageStoragePolicy v) { + $_setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasMessageStoragePolicy() => $_has(2); + @$pb.TagNumber(3) + void clearMessageStoragePolicy() => $_clearField(3); + @$pb.TagNumber(3) + MessageStoragePolicy ensureMessageStoragePolicy() => $_ensure(2); + + /// Optional. The resource name of the Cloud KMS CryptoKey to be used to + /// protect access to messages published on this topic. + /// + /// The expected format is `projects/*/locations/*/keyRings/*/cryptoKeys/*`. + @$pb.TagNumber(5) + $core.String get kmsKeyName => $_getSZ(3); + @$pb.TagNumber(5) + set kmsKeyName($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(5) + $core.bool hasKmsKeyName() => $_has(3); + @$pb.TagNumber(5) + void clearKmsKeyName() => $_clearField(5); + + /// Optional. Settings for validating messages published against a schema. + @$pb.TagNumber(6) + SchemaSettings get schemaSettings => $_getN(4); + @$pb.TagNumber(6) + set schemaSettings(SchemaSettings v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasSchemaSettings() => $_has(4); + @$pb.TagNumber(6) + void clearSchemaSettings() => $_clearField(6); + @$pb.TagNumber(6) + SchemaSettings ensureSchemaSettings() => $_ensure(4); + + /// Optional. Reserved for future use. This field is set only in responses from + /// the server; it is ignored if it is set in any requests. + @$pb.TagNumber(7) + $core.bool get satisfiesPzs => $_getBF(5); + @$pb.TagNumber(7) + set satisfiesPzs($core.bool v) { + $_setBool(5, v); + } + + @$pb.TagNumber(7) + $core.bool hasSatisfiesPzs() => $_has(5); + @$pb.TagNumber(7) + void clearSatisfiesPzs() => $_clearField(7); + + /// Optional. Indicates the minimum duration to retain a message after it is + /// published to the topic. If this field is set, messages published to the + /// topic in the last `message_retention_duration` are always available to + /// subscribers. For instance, it allows any attached subscription to [seek to + /// a + /// timestamp](https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time) + /// that is up to `message_retention_duration` in the past. If this field is + /// not set, message retention is controlled by settings on individual + /// subscriptions. Cannot be more than 31 days or less than 10 minutes. + @$pb.TagNumber(8) + $5.Duration get messageRetentionDuration => $_getN(6); + @$pb.TagNumber(8) + set messageRetentionDuration($5.Duration v) { + $_setField(8, v); + } + + @$pb.TagNumber(8) + $core.bool hasMessageRetentionDuration() => $_has(6); + @$pb.TagNumber(8) + void clearMessageRetentionDuration() => $_clearField(8); + @$pb.TagNumber(8) + $5.Duration ensureMessageRetentionDuration() => $_ensure(6); + + /// Output only. An output-only field indicating the state of the topic. + @$pb.TagNumber(9) + Topic_State get state => $_getN(7); + @$pb.TagNumber(9) + set state(Topic_State v) { + $_setField(9, v); + } + + @$pb.TagNumber(9) + $core.bool hasState() => $_has(7); + @$pb.TagNumber(9) + void clearState() => $_clearField(9); + + /// Optional. Settings for ingestion from a data source into this topic. + @$pb.TagNumber(10) + IngestionDataSourceSettings get ingestionDataSourceSettings => $_getN(8); + @$pb.TagNumber(10) + set ingestionDataSourceSettings(IngestionDataSourceSettings v) { + $_setField(10, v); + } + + @$pb.TagNumber(10) + $core.bool hasIngestionDataSourceSettings() => $_has(8); + @$pb.TagNumber(10) + void clearIngestionDataSourceSettings() => $_clearField(10); + @$pb.TagNumber(10) + IngestionDataSourceSettings ensureIngestionDataSourceSettings() => + $_ensure(8); + + /// Optional. Transforms to be applied to messages published to the topic. + /// Transforms are applied in the order specified. + @$pb.TagNumber(13) + $pb.PbList get messageTransforms => $_getList(9); + + /// Optional. Input only. Immutable. Tag keys/values directly bound to this + /// resource. For example: + /// "123/environment": "production", + /// "123/costCenter": "marketing" + /// See https://docs.cloud.google.com/pubsub/docs/tags for more information on + /// using tags with Pub/Sub resources. + @$pb.TagNumber(14) + $pb.PbMap<$core.String, $core.String> get tags => $_getMap(10); +} + +/// A message that is published by publishers and consumed by subscribers. The +/// message must contain either a non-empty data field or at least one attribute. +/// Note that client libraries represent this object differently +/// depending on the language. See the corresponding [client library +/// documentation](https://cloud.google.com/pubsub/docs/reference/libraries) for +/// more information. See [quotas and limits] +/// (https://cloud.google.com/pubsub/quotas) for more information about message +/// limits. +class PubsubMessage extends $pb.GeneratedMessage { + factory PubsubMessage({ + $core.List<$core.int>? data, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? attributes, + $core.String? messageId, + $3.Timestamp? publishTime, + $core.String? orderingKey, + }) { + final $result = create(); + if (data != null) { + $result.data = data; + } + if (attributes != null) { + $result.attributes.addEntries(attributes); + } + if (messageId != null) { + $result.messageId = messageId; + } + if (publishTime != null) { + $result.publishTime = publishTime; + } + if (orderingKey != null) { + $result.orderingKey = orderingKey; + } + return $result; + } + PubsubMessage._() : super(); + factory PubsubMessage.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PubsubMessage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PubsubMessage', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..a<$core.List<$core.int>>( + 1, _omitFieldNames ? '' : 'data', $pb.PbFieldType.OY) + ..m<$core.String, $core.String>(2, _omitFieldNames ? '' : 'attributes', + entryClassName: 'PubsubMessage.AttributesEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..aOS(3, _omitFieldNames ? '' : 'messageId') + ..aOM<$3.Timestamp>(4, _omitFieldNames ? '' : 'publishTime', + subBuilder: $3.Timestamp.create) + ..aOS(5, _omitFieldNames ? '' : 'orderingKey') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PubsubMessage clone() => PubsubMessage()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PubsubMessage copyWith(void Function(PubsubMessage) updates) => + super.copyWith((message) => updates(message as PubsubMessage)) + as PubsubMessage; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PubsubMessage create() => PubsubMessage._(); + PubsubMessage createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PubsubMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PubsubMessage? _defaultInstance; + + /// Optional. The message data field. If this field is empty, the message must + /// contain at least one attribute. + @$pb.TagNumber(1) + $core.List<$core.int> get data => $_getN(0); + @$pb.TagNumber(1) + set data($core.List<$core.int> v) { + $_setBytes(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasData() => $_has(0); + @$pb.TagNumber(1) + void clearData() => $_clearField(1); + + /// Optional. Attributes for this message. If this field is empty, the message + /// must contain non-empty data. This can be used to filter messages on the + /// subscription. + @$pb.TagNumber(2) + $pb.PbMap<$core.String, $core.String> get attributes => $_getMap(1); + + /// ID of this message, assigned by the server when the message is published. + /// Guaranteed to be unique within the topic. This value may be read by a + /// subscriber that receives a `PubsubMessage` via a `Pull` call or a push + /// delivery. It must not be populated by the publisher in a `Publish` call. + @$pb.TagNumber(3) + $core.String get messageId => $_getSZ(2); + @$pb.TagNumber(3) + set messageId($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasMessageId() => $_has(2); + @$pb.TagNumber(3) + void clearMessageId() => $_clearField(3); + + /// The time at which the message was published, populated by the server when + /// it receives the `Publish` call. It must not be populated by the + /// publisher in a `Publish` call. + @$pb.TagNumber(4) + $3.Timestamp get publishTime => $_getN(3); + @$pb.TagNumber(4) + set publishTime($3.Timestamp v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasPublishTime() => $_has(3); + @$pb.TagNumber(4) + void clearPublishTime() => $_clearField(4); + @$pb.TagNumber(4) + $3.Timestamp ensurePublishTime() => $_ensure(3); + + /// Optional. If non-empty, identifies related messages for which publish order + /// should be respected. If a `Subscription` has `enable_message_ordering` set + /// to `true`, messages published with the same non-empty `ordering_key` value + /// will be delivered to subscribers in the order in which they are received by + /// the Pub/Sub system. All `PubsubMessage`s published in a given + /// `PublishRequest` must specify the same `ordering_key` value. For more + /// information, see [ordering + /// messages](https://cloud.google.com/pubsub/docs/ordering). + @$pb.TagNumber(5) + $core.String get orderingKey => $_getSZ(4); + @$pb.TagNumber(5) + set orderingKey($core.String v) { + $_setString(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasOrderingKey() => $_has(4); + @$pb.TagNumber(5) + void clearOrderingKey() => $_clearField(5); +} + +/// Request for the GetTopic method. +class GetTopicRequest extends $pb.GeneratedMessage { + factory GetTopicRequest({ + $core.String? topic, + }) { + final $result = create(); + if (topic != null) { + $result.topic = topic; + } + return $result; + } + GetTopicRequest._() : super(); + factory GetTopicRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory GetTopicRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'GetTopicRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'topic') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetTopicRequest clone() => GetTopicRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetTopicRequest copyWith(void Function(GetTopicRequest) updates) => + super.copyWith((message) => updates(message as GetTopicRequest)) + as GetTopicRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static GetTopicRequest create() => GetTopicRequest._(); + GetTopicRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GetTopicRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static GetTopicRequest? _defaultInstance; + + /// Required. The name of the topic to get. + /// Format is `projects/{project}/topics/{topic}`. + @$pb.TagNumber(1) + $core.String get topic => $_getSZ(0); + @$pb.TagNumber(1) + set topic($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTopic() => $_has(0); + @$pb.TagNumber(1) + void clearTopic() => $_clearField(1); +} + +/// Request for the UpdateTopic method. +class UpdateTopicRequest extends $pb.GeneratedMessage { + factory UpdateTopicRequest({ + Topic? topic, + $6.FieldMask? updateMask, + }) { + final $result = create(); + if (topic != null) { + $result.topic = topic; + } + if (updateMask != null) { + $result.updateMask = updateMask; + } + return $result; + } + UpdateTopicRequest._() : super(); + factory UpdateTopicRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory UpdateTopicRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'UpdateTopicRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'topic', subBuilder: Topic.create) + ..aOM<$6.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', + subBuilder: $6.FieldMask.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + UpdateTopicRequest clone() => UpdateTopicRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + UpdateTopicRequest copyWith(void Function(UpdateTopicRequest) updates) => + super.copyWith((message) => updates(message as UpdateTopicRequest)) + as UpdateTopicRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static UpdateTopicRequest create() => UpdateTopicRequest._(); + UpdateTopicRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static UpdateTopicRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static UpdateTopicRequest? _defaultInstance; + + /// Required. The updated topic object. + @$pb.TagNumber(1) + Topic get topic => $_getN(0); + @$pb.TagNumber(1) + set topic(Topic v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasTopic() => $_has(0); + @$pb.TagNumber(1) + void clearTopic() => $_clearField(1); + @$pb.TagNumber(1) + Topic ensureTopic() => $_ensure(0); + + /// Required. Indicates which fields in the provided topic to update. Must be + /// specified and non-empty. Note that if `update_mask` contains + /// "message_storage_policy" but the `message_storage_policy` is not set in + /// the `topic` provided above, then the updated value is determined by the + /// policy configured at the project or organization level. + @$pb.TagNumber(2) + $6.FieldMask get updateMask => $_getN(1); + @$pb.TagNumber(2) + set updateMask($6.FieldMask v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasUpdateMask() => $_has(1); + @$pb.TagNumber(2) + void clearUpdateMask() => $_clearField(2); + @$pb.TagNumber(2) + $6.FieldMask ensureUpdateMask() => $_ensure(1); +} + +/// Request for the Publish method. +class PublishRequest extends $pb.GeneratedMessage { + factory PublishRequest({ + $core.String? topic, + $core.Iterable? messages, + }) { + final $result = create(); + if (topic != null) { + $result.topic = topic; + } + if (messages != null) { + $result.messages.addAll(messages); + } + return $result; + } + PublishRequest._() : super(); + factory PublishRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PublishRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PublishRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'topic') + ..pc( + 2, _omitFieldNames ? '' : 'messages', $pb.PbFieldType.PM, + subBuilder: PubsubMessage.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PublishRequest clone() => PublishRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PublishRequest copyWith(void Function(PublishRequest) updates) => + super.copyWith((message) => updates(message as PublishRequest)) + as PublishRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PublishRequest create() => PublishRequest._(); + PublishRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PublishRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PublishRequest? _defaultInstance; + + /// Required. The messages in the request will be published on this topic. + /// Format is `projects/{project}/topics/{topic}`. + @$pb.TagNumber(1) + $core.String get topic => $_getSZ(0); + @$pb.TagNumber(1) + set topic($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTopic() => $_has(0); + @$pb.TagNumber(1) + void clearTopic() => $_clearField(1); + + /// Required. The messages to publish. + @$pb.TagNumber(2) + $pb.PbList get messages => $_getList(1); +} + +/// Response for the `Publish` method. +class PublishResponse extends $pb.GeneratedMessage { + factory PublishResponse({ + $core.Iterable<$core.String>? messageIds, + }) { + final $result = create(); + if (messageIds != null) { + $result.messageIds.addAll(messageIds); + } + return $result; + } + PublishResponse._() : super(); + factory PublishResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PublishResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PublishResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pPS(1, _omitFieldNames ? '' : 'messageIds') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PublishResponse clone() => PublishResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PublishResponse copyWith(void Function(PublishResponse) updates) => + super.copyWith((message) => updates(message as PublishResponse)) + as PublishResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PublishResponse create() => PublishResponse._(); + PublishResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PublishResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PublishResponse? _defaultInstance; + + /// Optional. The server-assigned ID of each published message, in the same + /// order as the messages in the request. IDs are guaranteed to be unique + /// within the topic. + @$pb.TagNumber(1) + $pb.PbList<$core.String> get messageIds => $_getList(0); +} + +/// Request for the `ListTopics` method. +class ListTopicsRequest extends $pb.GeneratedMessage { + factory ListTopicsRequest({ + $core.String? project, + $core.int? pageSize, + $core.String? pageToken, + }) { + final $result = create(); + if (project != null) { + $result.project = project; + } + if (pageSize != null) { + $result.pageSize = pageSize; + } + if (pageToken != null) { + $result.pageToken = pageToken; + } + return $result; + } + ListTopicsRequest._() : super(); + factory ListTopicsRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListTopicsRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListTopicsRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'project') + ..a<$core.int>(2, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.O3) + ..aOS(3, _omitFieldNames ? '' : 'pageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicsRequest clone() => ListTopicsRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicsRequest copyWith(void Function(ListTopicsRequest) updates) => + super.copyWith((message) => updates(message as ListTopicsRequest)) + as ListTopicsRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListTopicsRequest create() => ListTopicsRequest._(); + ListTopicsRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListTopicsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListTopicsRequest? _defaultInstance; + + /// Required. The name of the project in which to list topics. + /// Format is `projects/{project-id}`. + @$pb.TagNumber(1) + $core.String get project => $_getSZ(0); + @$pb.TagNumber(1) + set project($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasProject() => $_has(0); + @$pb.TagNumber(1) + void clearProject() => $_clearField(1); + + /// Optional. Maximum number of topics to return. + @$pb.TagNumber(2) + $core.int get pageSize => $_getIZ(1); + @$pb.TagNumber(2) + set pageSize($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPageSize() => $_has(1); + @$pb.TagNumber(2) + void clearPageSize() => $_clearField(2); + + /// Optional. The value returned by the last `ListTopicsResponse`; indicates + /// that this is a continuation of a prior `ListTopics` call, and that the + /// system should return the next page of data. + @$pb.TagNumber(3) + $core.String get pageToken => $_getSZ(2); + @$pb.TagNumber(3) + set pageToken($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPageToken() => $_has(2); + @$pb.TagNumber(3) + void clearPageToken() => $_clearField(3); +} + +/// Response for the `ListTopics` method. +class ListTopicsResponse extends $pb.GeneratedMessage { + factory ListTopicsResponse({ + $core.Iterable? topics, + $core.String? nextPageToken, + }) { + final $result = create(); + if (topics != null) { + $result.topics.addAll(topics); + } + if (nextPageToken != null) { + $result.nextPageToken = nextPageToken; + } + return $result; + } + ListTopicsResponse._() : super(); + factory ListTopicsResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListTopicsResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListTopicsResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pc(1, _omitFieldNames ? '' : 'topics', $pb.PbFieldType.PM, + subBuilder: Topic.create) + ..aOS(2, _omitFieldNames ? '' : 'nextPageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicsResponse clone() => ListTopicsResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicsResponse copyWith(void Function(ListTopicsResponse) updates) => + super.copyWith((message) => updates(message as ListTopicsResponse)) + as ListTopicsResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListTopicsResponse create() => ListTopicsResponse._(); + ListTopicsResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListTopicsResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListTopicsResponse? _defaultInstance; + + /// Optional. The resulting topics. + @$pb.TagNumber(1) + $pb.PbList get topics => $_getList(0); + + /// Optional. If not empty, indicates that there may be more topics that match + /// the request; this value should be passed in a new `ListTopicsRequest`. + @$pb.TagNumber(2) + $core.String get nextPageToken => $_getSZ(1); + @$pb.TagNumber(2) + set nextPageToken($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNextPageToken() => $_has(1); + @$pb.TagNumber(2) + void clearNextPageToken() => $_clearField(2); +} + +/// Request for the `ListTopicSubscriptions` method. +class ListTopicSubscriptionsRequest extends $pb.GeneratedMessage { + factory ListTopicSubscriptionsRequest({ + $core.String? topic, + $core.int? pageSize, + $core.String? pageToken, + }) { + final $result = create(); + if (topic != null) { + $result.topic = topic; + } + if (pageSize != null) { + $result.pageSize = pageSize; + } + if (pageToken != null) { + $result.pageToken = pageToken; + } + return $result; + } + ListTopicSubscriptionsRequest._() : super(); + factory ListTopicSubscriptionsRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListTopicSubscriptionsRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListTopicSubscriptionsRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'topic') + ..a<$core.int>(2, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.O3) + ..aOS(3, _omitFieldNames ? '' : 'pageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicSubscriptionsRequest clone() => + ListTopicSubscriptionsRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicSubscriptionsRequest copyWith( + void Function(ListTopicSubscriptionsRequest) updates) => + super.copyWith( + (message) => updates(message as ListTopicSubscriptionsRequest)) + as ListTopicSubscriptionsRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListTopicSubscriptionsRequest create() => + ListTopicSubscriptionsRequest._(); + ListTopicSubscriptionsRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListTopicSubscriptionsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListTopicSubscriptionsRequest? _defaultInstance; + + /// Required. The name of the topic that subscriptions are attached to. + /// Format is `projects/{project}/topics/{topic}`. + @$pb.TagNumber(1) + $core.String get topic => $_getSZ(0); + @$pb.TagNumber(1) + set topic($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTopic() => $_has(0); + @$pb.TagNumber(1) + void clearTopic() => $_clearField(1); + + /// Optional. Maximum number of subscription names to return. + @$pb.TagNumber(2) + $core.int get pageSize => $_getIZ(1); + @$pb.TagNumber(2) + set pageSize($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPageSize() => $_has(1); + @$pb.TagNumber(2) + void clearPageSize() => $_clearField(2); + + /// Optional. The value returned by the last `ListTopicSubscriptionsResponse`; + /// indicates that this is a continuation of a prior `ListTopicSubscriptions` + /// call, and that the system should return the next page of data. + @$pb.TagNumber(3) + $core.String get pageToken => $_getSZ(2); + @$pb.TagNumber(3) + set pageToken($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPageToken() => $_has(2); + @$pb.TagNumber(3) + void clearPageToken() => $_clearField(3); +} + +/// Response for the `ListTopicSubscriptions` method. +class ListTopicSubscriptionsResponse extends $pb.GeneratedMessage { + factory ListTopicSubscriptionsResponse({ + $core.Iterable<$core.String>? subscriptions, + $core.String? nextPageToken, + }) { + final $result = create(); + if (subscriptions != null) { + $result.subscriptions.addAll(subscriptions); + } + if (nextPageToken != null) { + $result.nextPageToken = nextPageToken; + } + return $result; + } + ListTopicSubscriptionsResponse._() : super(); + factory ListTopicSubscriptionsResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListTopicSubscriptionsResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListTopicSubscriptionsResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pPS(1, _omitFieldNames ? '' : 'subscriptions') + ..aOS(2, _omitFieldNames ? '' : 'nextPageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicSubscriptionsResponse clone() => + ListTopicSubscriptionsResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicSubscriptionsResponse copyWith( + void Function(ListTopicSubscriptionsResponse) updates) => + super.copyWith( + (message) => updates(message as ListTopicSubscriptionsResponse)) + as ListTopicSubscriptionsResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListTopicSubscriptionsResponse create() => + ListTopicSubscriptionsResponse._(); + ListTopicSubscriptionsResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListTopicSubscriptionsResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListTopicSubscriptionsResponse? _defaultInstance; + + /// Optional. The names of subscriptions attached to the topic specified in the + /// request. + @$pb.TagNumber(1) + $pb.PbList<$core.String> get subscriptions => $_getList(0); + + /// Optional. If not empty, indicates that there may be more subscriptions that + /// match the request; this value should be passed in a new + /// `ListTopicSubscriptionsRequest` to get more subscriptions. + @$pb.TagNumber(2) + $core.String get nextPageToken => $_getSZ(1); + @$pb.TagNumber(2) + set nextPageToken($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNextPageToken() => $_has(1); + @$pb.TagNumber(2) + void clearNextPageToken() => $_clearField(2); +} + +/// Request for the `ListTopicSnapshots` method. +class ListTopicSnapshotsRequest extends $pb.GeneratedMessage { + factory ListTopicSnapshotsRequest({ + $core.String? topic, + $core.int? pageSize, + $core.String? pageToken, + }) { + final $result = create(); + if (topic != null) { + $result.topic = topic; + } + if (pageSize != null) { + $result.pageSize = pageSize; + } + if (pageToken != null) { + $result.pageToken = pageToken; + } + return $result; + } + ListTopicSnapshotsRequest._() : super(); + factory ListTopicSnapshotsRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListTopicSnapshotsRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListTopicSnapshotsRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'topic') + ..a<$core.int>(2, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.O3) + ..aOS(3, _omitFieldNames ? '' : 'pageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicSnapshotsRequest clone() => + ListTopicSnapshotsRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicSnapshotsRequest copyWith( + void Function(ListTopicSnapshotsRequest) updates) => + super.copyWith((message) => updates(message as ListTopicSnapshotsRequest)) + as ListTopicSnapshotsRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListTopicSnapshotsRequest create() => ListTopicSnapshotsRequest._(); + ListTopicSnapshotsRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListTopicSnapshotsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListTopicSnapshotsRequest? _defaultInstance; + + /// Required. The name of the topic that snapshots are attached to. + /// Format is `projects/{project}/topics/{topic}`. + @$pb.TagNumber(1) + $core.String get topic => $_getSZ(0); + @$pb.TagNumber(1) + set topic($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTopic() => $_has(0); + @$pb.TagNumber(1) + void clearTopic() => $_clearField(1); + + /// Optional. Maximum number of snapshot names to return. + @$pb.TagNumber(2) + $core.int get pageSize => $_getIZ(1); + @$pb.TagNumber(2) + set pageSize($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPageSize() => $_has(1); + @$pb.TagNumber(2) + void clearPageSize() => $_clearField(2); + + /// Optional. The value returned by the last `ListTopicSnapshotsResponse`; + /// indicates that this is a continuation of a prior `ListTopicSnapshots` call, + /// and that the system should return the next page of data. + @$pb.TagNumber(3) + $core.String get pageToken => $_getSZ(2); + @$pb.TagNumber(3) + set pageToken($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPageToken() => $_has(2); + @$pb.TagNumber(3) + void clearPageToken() => $_clearField(3); +} + +/// Response for the `ListTopicSnapshots` method. +class ListTopicSnapshotsResponse extends $pb.GeneratedMessage { + factory ListTopicSnapshotsResponse({ + $core.Iterable<$core.String>? snapshots, + $core.String? nextPageToken, + }) { + final $result = create(); + if (snapshots != null) { + $result.snapshots.addAll(snapshots); + } + if (nextPageToken != null) { + $result.nextPageToken = nextPageToken; + } + return $result; + } + ListTopicSnapshotsResponse._() : super(); + factory ListTopicSnapshotsResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListTopicSnapshotsResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListTopicSnapshotsResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pPS(1, _omitFieldNames ? '' : 'snapshots') + ..aOS(2, _omitFieldNames ? '' : 'nextPageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicSnapshotsResponse clone() => + ListTopicSnapshotsResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListTopicSnapshotsResponse copyWith( + void Function(ListTopicSnapshotsResponse) updates) => + super.copyWith( + (message) => updates(message as ListTopicSnapshotsResponse)) + as ListTopicSnapshotsResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListTopicSnapshotsResponse create() => ListTopicSnapshotsResponse._(); + ListTopicSnapshotsResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListTopicSnapshotsResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListTopicSnapshotsResponse? _defaultInstance; + + /// Optional. The names of the snapshots that match the request. + @$pb.TagNumber(1) + $pb.PbList<$core.String> get snapshots => $_getList(0); + + /// Optional. If not empty, indicates that there may be more snapshots that + /// match the request; this value should be passed in a new + /// `ListTopicSnapshotsRequest` to get more snapshots. + @$pb.TagNumber(2) + $core.String get nextPageToken => $_getSZ(1); + @$pb.TagNumber(2) + set nextPageToken($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNextPageToken() => $_has(1); + @$pb.TagNumber(2) + void clearNextPageToken() => $_clearField(2); +} + +/// Request for the `DeleteTopic` method. +class DeleteTopicRequest extends $pb.GeneratedMessage { + factory DeleteTopicRequest({ + $core.String? topic, + }) { + final $result = create(); + if (topic != null) { + $result.topic = topic; + } + return $result; + } + DeleteTopicRequest._() : super(); + factory DeleteTopicRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DeleteTopicRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DeleteTopicRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'topic') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteTopicRequest clone() => DeleteTopicRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteTopicRequest copyWith(void Function(DeleteTopicRequest) updates) => + super.copyWith((message) => updates(message as DeleteTopicRequest)) + as DeleteTopicRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DeleteTopicRequest create() => DeleteTopicRequest._(); + DeleteTopicRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DeleteTopicRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DeleteTopicRequest? _defaultInstance; + + /// Required. Name of the topic to delete. + /// Format is `projects/{project}/topics/{topic}`. + @$pb.TagNumber(1) + $core.String get topic => $_getSZ(0); + @$pb.TagNumber(1) + set topic($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTopic() => $_has(0); + @$pb.TagNumber(1) + void clearTopic() => $_clearField(1); +} + +/// Request for the DetachSubscription method. +class DetachSubscriptionRequest extends $pb.GeneratedMessage { + factory DetachSubscriptionRequest({ + $core.String? subscription, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + return $result; + } + DetachSubscriptionRequest._() : super(); + factory DetachSubscriptionRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DetachSubscriptionRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DetachSubscriptionRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DetachSubscriptionRequest clone() => + DetachSubscriptionRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DetachSubscriptionRequest copyWith( + void Function(DetachSubscriptionRequest) updates) => + super.copyWith((message) => updates(message as DetachSubscriptionRequest)) + as DetachSubscriptionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DetachSubscriptionRequest create() => DetachSubscriptionRequest._(); + DetachSubscriptionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DetachSubscriptionRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DetachSubscriptionRequest? _defaultInstance; + + /// Required. The subscription to detach. + /// Format is `projects/{project}/subscriptions/{subscription}`. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); +} + +/// Response for the DetachSubscription method. +/// Reserved for future use. +class DetachSubscriptionResponse extends $pb.GeneratedMessage { + factory DetachSubscriptionResponse() => create(); + DetachSubscriptionResponse._() : super(); + factory DetachSubscriptionResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DetachSubscriptionResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DetachSubscriptionResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DetachSubscriptionResponse clone() => + DetachSubscriptionResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DetachSubscriptionResponse copyWith( + void Function(DetachSubscriptionResponse) updates) => + super.copyWith( + (message) => updates(message as DetachSubscriptionResponse)) + as DetachSubscriptionResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DetachSubscriptionResponse create() => DetachSubscriptionResponse._(); + DetachSubscriptionResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DetachSubscriptionResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DetachSubscriptionResponse? _defaultInstance; +} + +/// Information about an associated [Analytics Hub +/// subscription](https://cloud.google.com/bigquery/docs/analytics-hub-manage-subscriptions). +class Subscription_AnalyticsHubSubscriptionInfo extends $pb.GeneratedMessage { + factory Subscription_AnalyticsHubSubscriptionInfo({ + $core.String? listing, + $core.String? subscription, + }) { + final $result = create(); + if (listing != null) { + $result.listing = listing; + } + if (subscription != null) { + $result.subscription = subscription; + } + return $result; + } + Subscription_AnalyticsHubSubscriptionInfo._() : super(); + factory Subscription_AnalyticsHubSubscriptionInfo.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Subscription_AnalyticsHubSubscriptionInfo.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Subscription.AnalyticsHubSubscriptionInfo', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'listing') + ..aOS(2, _omitFieldNames ? '' : 'subscription') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Subscription_AnalyticsHubSubscriptionInfo clone() => + Subscription_AnalyticsHubSubscriptionInfo()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Subscription_AnalyticsHubSubscriptionInfo copyWith( + void Function(Subscription_AnalyticsHubSubscriptionInfo) updates) => + super.copyWith((message) => + updates(message as Subscription_AnalyticsHubSubscriptionInfo)) + as Subscription_AnalyticsHubSubscriptionInfo; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Subscription_AnalyticsHubSubscriptionInfo create() => + Subscription_AnalyticsHubSubscriptionInfo._(); + Subscription_AnalyticsHubSubscriptionInfo createEmptyInstance() => create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Subscription_AnalyticsHubSubscriptionInfo getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + Subscription_AnalyticsHubSubscriptionInfo>(create); + static Subscription_AnalyticsHubSubscriptionInfo? _defaultInstance; + + /// Optional. The name of the associated Analytics Hub listing resource. + /// Pattern: + /// "projects/{project}/locations/{location}/dataExchanges/{data_exchange}/listings/{listing}" + @$pb.TagNumber(1) + $core.String get listing => $_getSZ(0); + @$pb.TagNumber(1) + set listing($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasListing() => $_has(0); + @$pb.TagNumber(1) + void clearListing() => $_clearField(1); + + /// Optional. The name of the associated Analytics Hub subscription resource. + /// Pattern: + /// "projects/{project}/locations/{location}/subscriptions/{subscription}" + @$pb.TagNumber(2) + $core.String get subscription => $_getSZ(1); + @$pb.TagNumber(2) + set subscription($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasSubscription() => $_has(1); + @$pb.TagNumber(2) + void clearSubscription() => $_clearField(2); +} + +/// A subscription resource. If none of `push_config`, `bigquery_config`, or +/// `cloud_storage_config` is set, then the subscriber will pull and ack messages +/// using API methods. At most one of these fields may be set. +class Subscription extends $pb.GeneratedMessage { + factory Subscription({ + $core.String? name, + $core.String? topic, + PushConfig? pushConfig, + $core.int? ackDeadlineSeconds, + $core.bool? retainAckedMessages, + $5.Duration? messageRetentionDuration, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? labels, + $core.bool? enableMessageOrdering, + ExpirationPolicy? expirationPolicy, + $core.String? filter, + DeadLetterPolicy? deadLetterPolicy, + RetryPolicy? retryPolicy, + $core.bool? detached, + $core.bool? enableExactlyOnceDelivery, + $5.Duration? topicMessageRetentionDuration, + BigQueryConfig? bigqueryConfig, + Subscription_State? state, + CloudStorageConfig? cloudStorageConfig, + Subscription_AnalyticsHubSubscriptionInfo? analyticsHubSubscriptionInfo, + $core.Iterable? messageTransforms, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? tags, + BigtableConfig? bigtableConfig, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (topic != null) { + $result.topic = topic; + } + if (pushConfig != null) { + $result.pushConfig = pushConfig; + } + if (ackDeadlineSeconds != null) { + $result.ackDeadlineSeconds = ackDeadlineSeconds; + } + if (retainAckedMessages != null) { + $result.retainAckedMessages = retainAckedMessages; + } + if (messageRetentionDuration != null) { + $result.messageRetentionDuration = messageRetentionDuration; + } + if (labels != null) { + $result.labels.addEntries(labels); + } + if (enableMessageOrdering != null) { + $result.enableMessageOrdering = enableMessageOrdering; + } + if (expirationPolicy != null) { + $result.expirationPolicy = expirationPolicy; + } + if (filter != null) { + $result.filter = filter; + } + if (deadLetterPolicy != null) { + $result.deadLetterPolicy = deadLetterPolicy; + } + if (retryPolicy != null) { + $result.retryPolicy = retryPolicy; + } + if (detached != null) { + $result.detached = detached; + } + if (enableExactlyOnceDelivery != null) { + $result.enableExactlyOnceDelivery = enableExactlyOnceDelivery; + } + if (topicMessageRetentionDuration != null) { + $result.topicMessageRetentionDuration = topicMessageRetentionDuration; + } + if (bigqueryConfig != null) { + $result.bigqueryConfig = bigqueryConfig; + } + if (state != null) { + $result.state = state; + } + if (cloudStorageConfig != null) { + $result.cloudStorageConfig = cloudStorageConfig; + } + if (analyticsHubSubscriptionInfo != null) { + $result.analyticsHubSubscriptionInfo = analyticsHubSubscriptionInfo; + } + if (messageTransforms != null) { + $result.messageTransforms.addAll(messageTransforms); + } + if (tags != null) { + $result.tags.addEntries(tags); + } + if (bigtableConfig != null) { + $result.bigtableConfig = bigtableConfig; + } + return $result; + } + Subscription._() : super(); + factory Subscription.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Subscription.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Subscription', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..aOS(2, _omitFieldNames ? '' : 'topic') + ..aOM(4, _omitFieldNames ? '' : 'pushConfig', + subBuilder: PushConfig.create) + ..a<$core.int>( + 5, _omitFieldNames ? '' : 'ackDeadlineSeconds', $pb.PbFieldType.O3) + ..aOB(7, _omitFieldNames ? '' : 'retainAckedMessages') + ..aOM<$5.Duration>(8, _omitFieldNames ? '' : 'messageRetentionDuration', + subBuilder: $5.Duration.create) + ..m<$core.String, $core.String>(9, _omitFieldNames ? '' : 'labels', + entryClassName: 'Subscription.LabelsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..aOB(10, _omitFieldNames ? '' : 'enableMessageOrdering') + ..aOM(11, _omitFieldNames ? '' : 'expirationPolicy', + subBuilder: ExpirationPolicy.create) + ..aOS(12, _omitFieldNames ? '' : 'filter') + ..aOM(13, _omitFieldNames ? '' : 'deadLetterPolicy', + subBuilder: DeadLetterPolicy.create) + ..aOM(14, _omitFieldNames ? '' : 'retryPolicy', + subBuilder: RetryPolicy.create) + ..aOB(15, _omitFieldNames ? '' : 'detached') + ..aOB(16, _omitFieldNames ? '' : 'enableExactlyOnceDelivery') + ..aOM<$5.Duration>( + 17, _omitFieldNames ? '' : 'topicMessageRetentionDuration', + subBuilder: $5.Duration.create) + ..aOM(18, _omitFieldNames ? '' : 'bigqueryConfig', + subBuilder: BigQueryConfig.create) + ..e( + 19, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: Subscription_State.STATE_UNSPECIFIED, + valueOf: Subscription_State.valueOf, + enumValues: Subscription_State.values) + ..aOM(22, _omitFieldNames ? '' : 'cloudStorageConfig', + subBuilder: CloudStorageConfig.create) + ..aOM( + 23, _omitFieldNames ? '' : 'analyticsHubSubscriptionInfo', + subBuilder: Subscription_AnalyticsHubSubscriptionInfo.create) + ..pc( + 25, _omitFieldNames ? '' : 'messageTransforms', $pb.PbFieldType.PM, + subBuilder: MessageTransform.create) + ..m<$core.String, $core.String>(26, _omitFieldNames ? '' : 'tags', + entryClassName: 'Subscription.TagsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..aOM(27, _omitFieldNames ? '' : 'bigtableConfig', + subBuilder: BigtableConfig.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Subscription clone() => Subscription()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Subscription copyWith(void Function(Subscription) updates) => + super.copyWith((message) => updates(message as Subscription)) + as Subscription; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Subscription create() => Subscription._(); + Subscription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Subscription getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static Subscription? _defaultInstance; + + /// Required. Identifier. The name of the subscription. It must have the format + /// `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must + /// start with a letter, and contain only letters (`[A-Za-z]`), numbers + /// (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`), + /// plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters + /// in length, and it must not start with `"goog"`. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// Required. The name of the topic from which this subscription is receiving + /// messages. Format is `projects/{project}/topics/{topic}`. The value of this + /// field will be `_deleted-topic_` if the topic has been deleted. + @$pb.TagNumber(2) + $core.String get topic => $_getSZ(1); + @$pb.TagNumber(2) + set topic($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasTopic() => $_has(1); + @$pb.TagNumber(2) + void clearTopic() => $_clearField(2); + + /// Optional. If push delivery is used with this subscription, this field is + /// used to configure it. + @$pb.TagNumber(4) + PushConfig get pushConfig => $_getN(2); + @$pb.TagNumber(4) + set pushConfig(PushConfig v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasPushConfig() => $_has(2); + @$pb.TagNumber(4) + void clearPushConfig() => $_clearField(4); + @$pb.TagNumber(4) + PushConfig ensurePushConfig() => $_ensure(2); + + /// Optional. The approximate amount of time (on a best-effort basis) Pub/Sub + /// waits for the subscriber to acknowledge receipt before resending the + /// message. In the interval after the message is delivered and before it is + /// acknowledged, it is considered to be _outstanding_. During that time + /// period, the message will not be redelivered (on a best-effort basis). + /// + /// For pull subscriptions, this value is used as the initial value for the ack + /// deadline. To override this value for a given message, call + /// `ModifyAckDeadline` with the corresponding `ack_id` if using + /// non-streaming pull or send the `ack_id` in a + /// `StreamingModifyAckDeadlineRequest` if using streaming pull. + /// The minimum custom deadline you can specify is 10 seconds. + /// The maximum custom deadline you can specify is 600 seconds (10 minutes). + /// If this parameter is 0, a default value of 10 seconds is used. + /// + /// For push delivery, this value is also used to set the request timeout for + /// the call to the push endpoint. + /// + /// If the subscriber never acknowledges the message, the Pub/Sub + /// system will eventually redeliver the message. + @$pb.TagNumber(5) + $core.int get ackDeadlineSeconds => $_getIZ(3); + @$pb.TagNumber(5) + set ackDeadlineSeconds($core.int v) { + $_setSignedInt32(3, v); + } + + @$pb.TagNumber(5) + $core.bool hasAckDeadlineSeconds() => $_has(3); + @$pb.TagNumber(5) + void clearAckDeadlineSeconds() => $_clearField(5); + + /// Optional. Indicates whether to retain acknowledged messages. If true, then + /// messages are not expunged from the subscription's backlog, even if they are + /// acknowledged, until they fall out of the `message_retention_duration` + /// window. This must be true if you would like to [`Seek` to a timestamp] + /// (https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time) in + /// the past to replay previously-acknowledged messages. + @$pb.TagNumber(7) + $core.bool get retainAckedMessages => $_getBF(4); + @$pb.TagNumber(7) + set retainAckedMessages($core.bool v) { + $_setBool(4, v); + } + + @$pb.TagNumber(7) + $core.bool hasRetainAckedMessages() => $_has(4); + @$pb.TagNumber(7) + void clearRetainAckedMessages() => $_clearField(7); + + /// Optional. How long to retain unacknowledged messages in the subscription's + /// backlog, from the moment a message is published. If `retain_acked_messages` + /// is true, then this also configures the retention of acknowledged messages, + /// and thus configures how far back in time a `Seek` can be done. Defaults to + /// 7 days. Cannot be more than 31 days or less than 10 minutes. + @$pb.TagNumber(8) + $5.Duration get messageRetentionDuration => $_getN(5); + @$pb.TagNumber(8) + set messageRetentionDuration($5.Duration v) { + $_setField(8, v); + } + + @$pb.TagNumber(8) + $core.bool hasMessageRetentionDuration() => $_has(5); + @$pb.TagNumber(8) + void clearMessageRetentionDuration() => $_clearField(8); + @$pb.TagNumber(8) + $5.Duration ensureMessageRetentionDuration() => $_ensure(5); + + /// Optional. See [Creating and managing + /// labels](https://cloud.google.com/pubsub/docs/labels). + @$pb.TagNumber(9) + $pb.PbMap<$core.String, $core.String> get labels => $_getMap(6); + + /// Optional. If true, messages published with the same `ordering_key` in + /// `PubsubMessage` will be delivered to the subscribers in the order in which + /// they are received by the Pub/Sub system. Otherwise, they may be delivered + /// in any order. + @$pb.TagNumber(10) + $core.bool get enableMessageOrdering => $_getBF(7); + @$pb.TagNumber(10) + set enableMessageOrdering($core.bool v) { + $_setBool(7, v); + } + + @$pb.TagNumber(10) + $core.bool hasEnableMessageOrdering() => $_has(7); + @$pb.TagNumber(10) + void clearEnableMessageOrdering() => $_clearField(10); + + /// Optional. A policy that specifies the conditions for this subscription's + /// expiration. A subscription is considered active as long as any connected + /// subscriber is successfully consuming messages from the subscription or is + /// issuing operations on the subscription. If `expiration_policy` is not set, + /// a *default policy* with `ttl` of 31 days will be used. The minimum allowed + /// value for `expiration_policy.ttl` is 1 day. If `expiration_policy` is set, + /// but `expiration_policy.ttl` is not set, the subscription never expires. + @$pb.TagNumber(11) + ExpirationPolicy get expirationPolicy => $_getN(8); + @$pb.TagNumber(11) + set expirationPolicy(ExpirationPolicy v) { + $_setField(11, v); + } + + @$pb.TagNumber(11) + $core.bool hasExpirationPolicy() => $_has(8); + @$pb.TagNumber(11) + void clearExpirationPolicy() => $_clearField(11); + @$pb.TagNumber(11) + ExpirationPolicy ensureExpirationPolicy() => $_ensure(8); + + /// Optional. An expression written in the Pub/Sub [filter + /// language](https://cloud.google.com/pubsub/docs/filtering). If non-empty, + /// then only `PubsubMessage`s whose `attributes` field matches the filter are + /// delivered on this subscription. If empty, then no messages are filtered + /// out. + @$pb.TagNumber(12) + $core.String get filter => $_getSZ(9); + @$pb.TagNumber(12) + set filter($core.String v) { + $_setString(9, v); + } + + @$pb.TagNumber(12) + $core.bool hasFilter() => $_has(9); + @$pb.TagNumber(12) + void clearFilter() => $_clearField(12); + + /// Optional. A policy that specifies the conditions for dead lettering + /// messages in this subscription. If dead_letter_policy is not set, dead + /// lettering is disabled. + /// + /// The Pub/Sub service account associated with this subscriptions's + /// parent project (i.e., + /// service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have + /// permission to Acknowledge() messages on this subscription. + @$pb.TagNumber(13) + DeadLetterPolicy get deadLetterPolicy => $_getN(10); + @$pb.TagNumber(13) + set deadLetterPolicy(DeadLetterPolicy v) { + $_setField(13, v); + } + + @$pb.TagNumber(13) + $core.bool hasDeadLetterPolicy() => $_has(10); + @$pb.TagNumber(13) + void clearDeadLetterPolicy() => $_clearField(13); + @$pb.TagNumber(13) + DeadLetterPolicy ensureDeadLetterPolicy() => $_ensure(10); + + /// Optional. A policy that specifies how Pub/Sub retries message delivery for + /// this subscription. + /// + /// If not set, the default retry policy is applied. This generally implies + /// that messages will be retried as soon as possible for healthy subscribers. + /// RetryPolicy will be triggered on NACKs or acknowledgment deadline exceeded + /// events for a given message. + @$pb.TagNumber(14) + RetryPolicy get retryPolicy => $_getN(11); + @$pb.TagNumber(14) + set retryPolicy(RetryPolicy v) { + $_setField(14, v); + } + + @$pb.TagNumber(14) + $core.bool hasRetryPolicy() => $_has(11); + @$pb.TagNumber(14) + void clearRetryPolicy() => $_clearField(14); + @$pb.TagNumber(14) + RetryPolicy ensureRetryPolicy() => $_ensure(11); + + /// Optional. Indicates whether the subscription is detached from its topic. + /// Detached subscriptions don't receive messages from their topic and don't + /// retain any backlog. `Pull` and `StreamingPull` requests will return + /// FAILED_PRECONDITION. If the subscription is a push subscription, pushes to + /// the endpoint will not be made. + @$pb.TagNumber(15) + $core.bool get detached => $_getBF(12); + @$pb.TagNumber(15) + set detached($core.bool v) { + $_setBool(12, v); + } + + @$pb.TagNumber(15) + $core.bool hasDetached() => $_has(12); + @$pb.TagNumber(15) + void clearDetached() => $_clearField(15); + + /// Optional. If true, Pub/Sub provides the following guarantees for the + /// delivery of a message with a given value of `message_id` on this + /// subscription: + /// + /// * The message sent to a subscriber is guaranteed not to be resent + /// before the message's acknowledgment deadline expires. + /// * An acknowledged message will not be resent to a subscriber. + /// + /// Note that subscribers may still receive multiple copies of a message + /// when `enable_exactly_once_delivery` is true if the message was published + /// multiple times by a publisher client. These copies are considered distinct + /// by Pub/Sub and have distinct `message_id` values. + @$pb.TagNumber(16) + $core.bool get enableExactlyOnceDelivery => $_getBF(13); + @$pb.TagNumber(16) + set enableExactlyOnceDelivery($core.bool v) { + $_setBool(13, v); + } + + @$pb.TagNumber(16) + $core.bool hasEnableExactlyOnceDelivery() => $_has(13); + @$pb.TagNumber(16) + void clearEnableExactlyOnceDelivery() => $_clearField(16); + + /// Output only. Indicates the minimum duration for which a message is retained + /// after it is published to the subscription's topic. If this field is set, + /// messages published to the subscription's topic in the last + /// `topic_message_retention_duration` are always available to subscribers. See + /// the `message_retention_duration` field in `Topic`. This field is set only + /// in responses from the server; it is ignored if it is set in any requests. + @$pb.TagNumber(17) + $5.Duration get topicMessageRetentionDuration => $_getN(14); + @$pb.TagNumber(17) + set topicMessageRetentionDuration($5.Duration v) { + $_setField(17, v); + } + + @$pb.TagNumber(17) + $core.bool hasTopicMessageRetentionDuration() => $_has(14); + @$pb.TagNumber(17) + void clearTopicMessageRetentionDuration() => $_clearField(17); + @$pb.TagNumber(17) + $5.Duration ensureTopicMessageRetentionDuration() => $_ensure(14); + + /// Optional. If delivery to BigQuery is used with this subscription, this + /// field is used to configure it. + @$pb.TagNumber(18) + BigQueryConfig get bigqueryConfig => $_getN(15); + @$pb.TagNumber(18) + set bigqueryConfig(BigQueryConfig v) { + $_setField(18, v); + } + + @$pb.TagNumber(18) + $core.bool hasBigqueryConfig() => $_has(15); + @$pb.TagNumber(18) + void clearBigqueryConfig() => $_clearField(18); + @$pb.TagNumber(18) + BigQueryConfig ensureBigqueryConfig() => $_ensure(15); + + /// Output only. An output-only field indicating whether or not the + /// subscription can receive messages. + @$pb.TagNumber(19) + Subscription_State get state => $_getN(16); + @$pb.TagNumber(19) + set state(Subscription_State v) { + $_setField(19, v); + } + + @$pb.TagNumber(19) + $core.bool hasState() => $_has(16); + @$pb.TagNumber(19) + void clearState() => $_clearField(19); + + /// Optional. If delivery to Google Cloud Storage is used with this + /// subscription, this field is used to configure it. + @$pb.TagNumber(22) + CloudStorageConfig get cloudStorageConfig => $_getN(17); + @$pb.TagNumber(22) + set cloudStorageConfig(CloudStorageConfig v) { + $_setField(22, v); + } + + @$pb.TagNumber(22) + $core.bool hasCloudStorageConfig() => $_has(17); + @$pb.TagNumber(22) + void clearCloudStorageConfig() => $_clearField(22); + @$pb.TagNumber(22) + CloudStorageConfig ensureCloudStorageConfig() => $_ensure(17); + + /// Output only. Information about the associated Analytics Hub subscription. + /// Only set if the subscription is created by Analytics Hub. + @$pb.TagNumber(23) + Subscription_AnalyticsHubSubscriptionInfo get analyticsHubSubscriptionInfo => + $_getN(18); + @$pb.TagNumber(23) + set analyticsHubSubscriptionInfo( + Subscription_AnalyticsHubSubscriptionInfo v) { + $_setField(23, v); + } + + @$pb.TagNumber(23) + $core.bool hasAnalyticsHubSubscriptionInfo() => $_has(18); + @$pb.TagNumber(23) + void clearAnalyticsHubSubscriptionInfo() => $_clearField(23); + @$pb.TagNumber(23) + Subscription_AnalyticsHubSubscriptionInfo + ensureAnalyticsHubSubscriptionInfo() => $_ensure(18); + + /// Optional. Transforms to be applied to messages before they are delivered to + /// subscribers. Transforms are applied in the order specified. + @$pb.TagNumber(25) + $pb.PbList get messageTransforms => $_getList(19); + + /// Optional. Input only. Immutable. Tag keys/values directly bound to this + /// resource. For example: + /// "123/environment": "production", + /// "123/costCenter": "marketing" + /// See https://docs.cloud.google.com/pubsub/docs/tags for more information on + /// using tags with Pub/Sub resources. + @$pb.TagNumber(26) + $pb.PbMap<$core.String, $core.String> get tags => $_getMap(20); + + /// Optional. If delivery to Bigtable is used with this subscription, this + /// field is used to configure it. + @$pb.TagNumber(27) + BigtableConfig get bigtableConfig => $_getN(21); + @$pb.TagNumber(27) + set bigtableConfig(BigtableConfig v) { + $_setField(27, v); + } + + @$pb.TagNumber(27) + $core.bool hasBigtableConfig() => $_has(21); + @$pb.TagNumber(27) + void clearBigtableConfig() => $_clearField(27); + @$pb.TagNumber(27) + BigtableConfig ensureBigtableConfig() => $_ensure(21); +} + +/// A policy that specifies how Pub/Sub retries message delivery. +/// +/// Retry delay will be exponential based on provided minimum and maximum +/// backoffs. https://en.wikipedia.org/wiki/Exponential_backoff. +/// +/// RetryPolicy will be triggered on NACKs or acknowledgment deadline exceeded +/// events for a given message. +/// +/// Retry Policy is implemented on a best effort basis. At times, the delay +/// between consecutive deliveries may not match the configuration. That is, +/// delay can be more or less than configured backoff. +class RetryPolicy extends $pb.GeneratedMessage { + factory RetryPolicy({ + $5.Duration? minimumBackoff, + $5.Duration? maximumBackoff, + }) { + final $result = create(); + if (minimumBackoff != null) { + $result.minimumBackoff = minimumBackoff; + } + if (maximumBackoff != null) { + $result.maximumBackoff = maximumBackoff; + } + return $result; + } + RetryPolicy._() : super(); + factory RetryPolicy.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory RetryPolicy.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'RetryPolicy', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOM<$5.Duration>(1, _omitFieldNames ? '' : 'minimumBackoff', + subBuilder: $5.Duration.create) + ..aOM<$5.Duration>(2, _omitFieldNames ? '' : 'maximumBackoff', + subBuilder: $5.Duration.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + RetryPolicy clone() => RetryPolicy()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + RetryPolicy copyWith(void Function(RetryPolicy) updates) => + super.copyWith((message) => updates(message as RetryPolicy)) + as RetryPolicy; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static RetryPolicy create() => RetryPolicy._(); + RetryPolicy createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RetryPolicy getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static RetryPolicy? _defaultInstance; + + /// Optional. The minimum delay between consecutive deliveries of a given + /// message. Value should be between 0 and 600 seconds. Defaults to 10 seconds. + @$pb.TagNumber(1) + $5.Duration get minimumBackoff => $_getN(0); + @$pb.TagNumber(1) + set minimumBackoff($5.Duration v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasMinimumBackoff() => $_has(0); + @$pb.TagNumber(1) + void clearMinimumBackoff() => $_clearField(1); + @$pb.TagNumber(1) + $5.Duration ensureMinimumBackoff() => $_ensure(0); + + /// Optional. The maximum delay between consecutive deliveries of a given + /// message. Value should be between 0 and 600 seconds. Defaults to 600 + /// seconds. + @$pb.TagNumber(2) + $5.Duration get maximumBackoff => $_getN(1); + @$pb.TagNumber(2) + set maximumBackoff($5.Duration v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasMaximumBackoff() => $_has(1); + @$pb.TagNumber(2) + void clearMaximumBackoff() => $_clearField(2); + @$pb.TagNumber(2) + $5.Duration ensureMaximumBackoff() => $_ensure(1); +} + +/// Dead lettering is done on a best effort basis. The same message might be +/// dead lettered multiple times. +/// +/// If validation on any of the fields fails at subscription creation/updation, +/// the create/update subscription request will fail. +class DeadLetterPolicy extends $pb.GeneratedMessage { + factory DeadLetterPolicy({ + $core.String? deadLetterTopic, + $core.int? maxDeliveryAttempts, + }) { + final $result = create(); + if (deadLetterTopic != null) { + $result.deadLetterTopic = deadLetterTopic; + } + if (maxDeliveryAttempts != null) { + $result.maxDeliveryAttempts = maxDeliveryAttempts; + } + return $result; + } + DeadLetterPolicy._() : super(); + factory DeadLetterPolicy.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DeadLetterPolicy.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DeadLetterPolicy', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'deadLetterTopic') + ..a<$core.int>( + 2, _omitFieldNames ? '' : 'maxDeliveryAttempts', $pb.PbFieldType.O3) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeadLetterPolicy clone() => DeadLetterPolicy()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeadLetterPolicy copyWith(void Function(DeadLetterPolicy) updates) => + super.copyWith((message) => updates(message as DeadLetterPolicy)) + as DeadLetterPolicy; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DeadLetterPolicy create() => DeadLetterPolicy._(); + DeadLetterPolicy createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DeadLetterPolicy getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DeadLetterPolicy? _defaultInstance; + + /// Optional. The name of the topic to which dead letter messages should be + /// published. Format is `projects/{project}/topics/{topic}`.The Pub/Sub + /// service account associated with the enclosing subscription's parent project + /// (i.e., service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must + /// have permission to Publish() to this topic. + /// + /// The operation will fail if the topic does not exist. + /// Users should ensure that there is a subscription attached to this topic + /// since messages published to a topic with no subscriptions are lost. + @$pb.TagNumber(1) + $core.String get deadLetterTopic => $_getSZ(0); + @$pb.TagNumber(1) + set deadLetterTopic($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasDeadLetterTopic() => $_has(0); + @$pb.TagNumber(1) + void clearDeadLetterTopic() => $_clearField(1); + + /// Optional. The maximum number of delivery attempts for any message. The + /// value must be between 5 and 100. + /// + /// The number of delivery attempts is defined as 1 + (the sum of number of + /// NACKs and number of times the acknowledgment deadline has been exceeded + /// for the message). + /// + /// A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that + /// client libraries may automatically extend ack_deadlines. + /// + /// This field will be honored on a best effort basis. + /// + /// If this parameter is 0, a default value of 5 is used. + @$pb.TagNumber(2) + $core.int get maxDeliveryAttempts => $_getIZ(1); + @$pb.TagNumber(2) + set maxDeliveryAttempts($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasMaxDeliveryAttempts() => $_has(1); + @$pb.TagNumber(2) + void clearMaxDeliveryAttempts() => $_clearField(2); +} + +/// A policy that specifies the conditions for resource expiration (i.e., +/// automatic resource deletion). +class ExpirationPolicy extends $pb.GeneratedMessage { + factory ExpirationPolicy({ + $5.Duration? ttl, + }) { + final $result = create(); + if (ttl != null) { + $result.ttl = ttl; + } + return $result; + } + ExpirationPolicy._() : super(); + factory ExpirationPolicy.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ExpirationPolicy.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ExpirationPolicy', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOM<$5.Duration>(1, _omitFieldNames ? '' : 'ttl', + subBuilder: $5.Duration.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ExpirationPolicy clone() => ExpirationPolicy()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ExpirationPolicy copyWith(void Function(ExpirationPolicy) updates) => + super.copyWith((message) => updates(message as ExpirationPolicy)) + as ExpirationPolicy; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ExpirationPolicy create() => ExpirationPolicy._(); + ExpirationPolicy createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ExpirationPolicy getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ExpirationPolicy? _defaultInstance; + + /// Optional. Specifies the "time-to-live" duration for an associated resource. + /// The resource expires if it is not active for a period of `ttl`. The + /// definition of "activity" depends on the type of the associated resource. + /// The minimum and maximum allowed values for `ttl` depend on the type of the + /// associated resource, as well. If `ttl` is not set, the associated resource + /// never expires. + @$pb.TagNumber(1) + $5.Duration get ttl => $_getN(0); + @$pb.TagNumber(1) + set ttl($5.Duration v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasTtl() => $_has(0); + @$pb.TagNumber(1) + void clearTtl() => $_clearField(1); + @$pb.TagNumber(1) + $5.Duration ensureTtl() => $_ensure(0); +} + +/// Contains information needed for generating an +/// [OpenID Connect +/// token](https://developers.google.com/identity/protocols/OpenIDConnect). +class PushConfig_OidcToken extends $pb.GeneratedMessage { + factory PushConfig_OidcToken({ + $core.String? serviceAccountEmail, + $core.String? audience, + }) { + final $result = create(); + if (serviceAccountEmail != null) { + $result.serviceAccountEmail = serviceAccountEmail; + } + if (audience != null) { + $result.audience = audience; + } + return $result; + } + PushConfig_OidcToken._() : super(); + factory PushConfig_OidcToken.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PushConfig_OidcToken.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PushConfig.OidcToken', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'serviceAccountEmail') + ..aOS(2, _omitFieldNames ? '' : 'audience') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PushConfig_OidcToken clone() => + PushConfig_OidcToken()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PushConfig_OidcToken copyWith(void Function(PushConfig_OidcToken) updates) => + super.copyWith((message) => updates(message as PushConfig_OidcToken)) + as PushConfig_OidcToken; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PushConfig_OidcToken create() => PushConfig_OidcToken._(); + PushConfig_OidcToken createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PushConfig_OidcToken getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PushConfig_OidcToken? _defaultInstance; + + /// Optional. [Service account + /// email](https://cloud.google.com/iam/docs/service-accounts) + /// used for generating the OIDC token. For more information + /// on setting up authentication, see + /// [Push subscriptions](https://cloud.google.com/pubsub/docs/push). + @$pb.TagNumber(1) + $core.String get serviceAccountEmail => $_getSZ(0); + @$pb.TagNumber(1) + set serviceAccountEmail($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasServiceAccountEmail() => $_has(0); + @$pb.TagNumber(1) + void clearServiceAccountEmail() => $_clearField(1); + + /// Optional. Audience to be used when generating OIDC token. The audience + /// claim identifies the recipients that the JWT is intended for. The + /// audience value is a single case-sensitive string. Having multiple values + /// (array) for the audience field is not supported. More info about the OIDC + /// JWT token audience here: + /// https://tools.ietf.org/html/rfc7519#section-4.1.3 Note: if not specified, + /// the Push endpoint URL will be used. + @$pb.TagNumber(2) + $core.String get audience => $_getSZ(1); + @$pb.TagNumber(2) + set audience($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasAudience() => $_has(1); + @$pb.TagNumber(2) + void clearAudience() => $_clearField(2); +} + +/// The payload to the push endpoint is in the form of the JSON representation +/// of a PubsubMessage +/// (https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#pubsubmessage). +class PushConfig_PubsubWrapper extends $pb.GeneratedMessage { + factory PushConfig_PubsubWrapper() => create(); + PushConfig_PubsubWrapper._() : super(); + factory PushConfig_PubsubWrapper.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PushConfig_PubsubWrapper.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PushConfig.PubsubWrapper', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PushConfig_PubsubWrapper clone() => + PushConfig_PubsubWrapper()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PushConfig_PubsubWrapper copyWith( + void Function(PushConfig_PubsubWrapper) updates) => + super.copyWith((message) => updates(message as PushConfig_PubsubWrapper)) + as PushConfig_PubsubWrapper; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PushConfig_PubsubWrapper create() => PushConfig_PubsubWrapper._(); + PushConfig_PubsubWrapper createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PushConfig_PubsubWrapper getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PushConfig_PubsubWrapper? _defaultInstance; +} + +/// Sets the `data` field as the HTTP body for delivery. +class PushConfig_NoWrapper extends $pb.GeneratedMessage { + factory PushConfig_NoWrapper({ + $core.bool? writeMetadata, + }) { + final $result = create(); + if (writeMetadata != null) { + $result.writeMetadata = writeMetadata; + } + return $result; + } + PushConfig_NoWrapper._() : super(); + factory PushConfig_NoWrapper.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PushConfig_NoWrapper.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PushConfig.NoWrapper', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOB(1, _omitFieldNames ? '' : 'writeMetadata') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PushConfig_NoWrapper clone() => + PushConfig_NoWrapper()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PushConfig_NoWrapper copyWith(void Function(PushConfig_NoWrapper) updates) => + super.copyWith((message) => updates(message as PushConfig_NoWrapper)) + as PushConfig_NoWrapper; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PushConfig_NoWrapper create() => PushConfig_NoWrapper._(); + PushConfig_NoWrapper createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PushConfig_NoWrapper getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PushConfig_NoWrapper? _defaultInstance; + + /// Optional. When true, writes the Pub/Sub message metadata to + /// `x-goog-pubsub-:` headers of the HTTP request. Writes the + /// Pub/Sub message attributes to `:` headers of the HTTP request. + @$pb.TagNumber(1) + $core.bool get writeMetadata => $_getBF(0); + @$pb.TagNumber(1) + set writeMetadata($core.bool v) { + $_setBool(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasWriteMetadata() => $_has(0); + @$pb.TagNumber(1) + void clearWriteMetadata() => $_clearField(1); +} + +enum PushConfig_AuthenticationMethod { oidcToken, notSet } + +enum PushConfig_Wrapper { pubsubWrapper, noWrapper, notSet } + +/// Configuration for a push delivery endpoint. +class PushConfig extends $pb.GeneratedMessage { + factory PushConfig({ + $core.String? pushEndpoint, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? attributes, + PushConfig_OidcToken? oidcToken, + PushConfig_PubsubWrapper? pubsubWrapper, + PushConfig_NoWrapper? noWrapper, + }) { + final $result = create(); + if (pushEndpoint != null) { + $result.pushEndpoint = pushEndpoint; + } + if (attributes != null) { + $result.attributes.addEntries(attributes); + } + if (oidcToken != null) { + $result.oidcToken = oidcToken; + } + if (pubsubWrapper != null) { + $result.pubsubWrapper = pubsubWrapper; + } + if (noWrapper != null) { + $result.noWrapper = noWrapper; + } + return $result; + } + PushConfig._() : super(); + factory PushConfig.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PushConfig.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, PushConfig_AuthenticationMethod> + _PushConfig_AuthenticationMethodByTag = { + 3: PushConfig_AuthenticationMethod.oidcToken, + 0: PushConfig_AuthenticationMethod.notSet + }; + static const $core.Map<$core.int, PushConfig_Wrapper> + _PushConfig_WrapperByTag = { + 4: PushConfig_Wrapper.pubsubWrapper, + 5: PushConfig_Wrapper.noWrapper, + 0: PushConfig_Wrapper.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PushConfig', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [3]) + ..oo(1, [4, 5]) + ..aOS(1, _omitFieldNames ? '' : 'pushEndpoint') + ..m<$core.String, $core.String>(2, _omitFieldNames ? '' : 'attributes', + entryClassName: 'PushConfig.AttributesEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..aOM(3, _omitFieldNames ? '' : 'oidcToken', + subBuilder: PushConfig_OidcToken.create) + ..aOM(4, _omitFieldNames ? '' : 'pubsubWrapper', + subBuilder: PushConfig_PubsubWrapper.create) + ..aOM(5, _omitFieldNames ? '' : 'noWrapper', + subBuilder: PushConfig_NoWrapper.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PushConfig clone() => PushConfig()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PushConfig copyWith(void Function(PushConfig) updates) => + super.copyWith((message) => updates(message as PushConfig)) as PushConfig; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PushConfig create() => PushConfig._(); + PushConfig createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PushConfig getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PushConfig? _defaultInstance; + + PushConfig_AuthenticationMethod whichAuthenticationMethod() => + _PushConfig_AuthenticationMethodByTag[$_whichOneof(0)]!; + void clearAuthenticationMethod() => $_clearField($_whichOneof(0)); + + PushConfig_Wrapper whichWrapper() => + _PushConfig_WrapperByTag[$_whichOneof(1)]!; + void clearWrapper() => $_clearField($_whichOneof(1)); + + /// Optional. A URL locating the endpoint to which messages should be pushed. + /// For example, a Webhook endpoint might use `https://example.com/push`. + @$pb.TagNumber(1) + $core.String get pushEndpoint => $_getSZ(0); + @$pb.TagNumber(1) + set pushEndpoint($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasPushEndpoint() => $_has(0); + @$pb.TagNumber(1) + void clearPushEndpoint() => $_clearField(1); + + /// Optional. Endpoint configuration attributes that can be used to control + /// different aspects of the message delivery. + /// + /// The only currently supported attribute is `x-goog-version`, which you can + /// use to change the format of the pushed message. This attribute + /// indicates the version of the data expected by the endpoint. This + /// controls the shape of the pushed message (i.e., its fields and metadata). + /// + /// If not present during the `CreateSubscription` call, it will default to + /// the version of the Pub/Sub API used to make such call. If not present in a + /// `ModifyPushConfig` call, its value will not be changed. `GetSubscription` + /// calls will always return a valid version, even if the subscription was + /// created without this attribute. + /// + /// The only supported values for the `x-goog-version` attribute are: + /// + /// * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API. + /// * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API. + /// + /// For example: + /// `attributes { "x-goog-version": "v1" }` + @$pb.TagNumber(2) + $pb.PbMap<$core.String, $core.String> get attributes => $_getMap(1); + + /// Optional. If specified, Pub/Sub will generate and attach an OIDC JWT + /// token as an `Authorization` header in the HTTP request for every pushed + /// message. + @$pb.TagNumber(3) + PushConfig_OidcToken get oidcToken => $_getN(2); + @$pb.TagNumber(3) + set oidcToken(PushConfig_OidcToken v) { + $_setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasOidcToken() => $_has(2); + @$pb.TagNumber(3) + void clearOidcToken() => $_clearField(3); + @$pb.TagNumber(3) + PushConfig_OidcToken ensureOidcToken() => $_ensure(2); + + /// Optional. When set, the payload to the push endpoint is in the form of + /// the JSON representation of a PubsubMessage + /// (https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#pubsubmessage). + @$pb.TagNumber(4) + PushConfig_PubsubWrapper get pubsubWrapper => $_getN(3); + @$pb.TagNumber(4) + set pubsubWrapper(PushConfig_PubsubWrapper v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasPubsubWrapper() => $_has(3); + @$pb.TagNumber(4) + void clearPubsubWrapper() => $_clearField(4); + @$pb.TagNumber(4) + PushConfig_PubsubWrapper ensurePubsubWrapper() => $_ensure(3); + + /// Optional. When set, the payload to the push endpoint is not wrapped. + @$pb.TagNumber(5) + PushConfig_NoWrapper get noWrapper => $_getN(4); + @$pb.TagNumber(5) + set noWrapper(PushConfig_NoWrapper v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasNoWrapper() => $_has(4); + @$pb.TagNumber(5) + void clearNoWrapper() => $_clearField(5); + @$pb.TagNumber(5) + PushConfig_NoWrapper ensureNoWrapper() => $_ensure(4); +} + +/// Configuration for a BigQuery subscription. +class BigQueryConfig extends $pb.GeneratedMessage { + factory BigQueryConfig({ + $core.String? table, + $core.bool? useTopicSchema, + $core.bool? writeMetadata, + $core.bool? dropUnknownFields, + BigQueryConfig_State? state, + $core.bool? useTableSchema, + $core.String? serviceAccountEmail, + }) { + final $result = create(); + if (table != null) { + $result.table = table; + } + if (useTopicSchema != null) { + $result.useTopicSchema = useTopicSchema; + } + if (writeMetadata != null) { + $result.writeMetadata = writeMetadata; + } + if (dropUnknownFields != null) { + $result.dropUnknownFields = dropUnknownFields; + } + if (state != null) { + $result.state = state; + } + if (useTableSchema != null) { + $result.useTableSchema = useTableSchema; + } + if (serviceAccountEmail != null) { + $result.serviceAccountEmail = serviceAccountEmail; + } + return $result; + } + BigQueryConfig._() : super(); + factory BigQueryConfig.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory BigQueryConfig.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BigQueryConfig', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'table') + ..aOB(2, _omitFieldNames ? '' : 'useTopicSchema') + ..aOB(3, _omitFieldNames ? '' : 'writeMetadata') + ..aOB(4, _omitFieldNames ? '' : 'dropUnknownFields') + ..e( + 5, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: BigQueryConfig_State.STATE_UNSPECIFIED, + valueOf: BigQueryConfig_State.valueOf, + enumValues: BigQueryConfig_State.values) + ..aOB(6, _omitFieldNames ? '' : 'useTableSchema') + ..aOS(7, _omitFieldNames ? '' : 'serviceAccountEmail') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BigQueryConfig clone() => BigQueryConfig()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BigQueryConfig copyWith(void Function(BigQueryConfig) updates) => + super.copyWith((message) => updates(message as BigQueryConfig)) + as BigQueryConfig; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BigQueryConfig create() => BigQueryConfig._(); + BigQueryConfig createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static BigQueryConfig getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static BigQueryConfig? _defaultInstance; + + /// Optional. The name of the table to which to write data, of the form + /// {projectId}.{datasetId}.{tableId} + @$pb.TagNumber(1) + $core.String get table => $_getSZ(0); + @$pb.TagNumber(1) + set table($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTable() => $_has(0); + @$pb.TagNumber(1) + void clearTable() => $_clearField(1); + + /// Optional. When true, use the topic's schema as the columns to write to in + /// BigQuery, if it exists. `use_topic_schema` and `use_table_schema` cannot be + /// enabled at the same time. + @$pb.TagNumber(2) + $core.bool get useTopicSchema => $_getBF(1); + @$pb.TagNumber(2) + set useTopicSchema($core.bool v) { + $_setBool(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasUseTopicSchema() => $_has(1); + @$pb.TagNumber(2) + void clearUseTopicSchema() => $_clearField(2); + + /// Optional. When true, write the subscription name, message_id, publish_time, + /// attributes, and ordering_key to additional columns in the table. The + /// subscription name, message_id, and publish_time fields are put in their own + /// columns while all other message properties (other than data) are written to + /// a JSON object in the attributes column. + @$pb.TagNumber(3) + $core.bool get writeMetadata => $_getBF(2); + @$pb.TagNumber(3) + set writeMetadata($core.bool v) { + $_setBool(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasWriteMetadata() => $_has(2); + @$pb.TagNumber(3) + void clearWriteMetadata() => $_clearField(3); + + /// Optional. When true and use_topic_schema is true, any fields that are a + /// part of the topic schema that are not part of the BigQuery table schema are + /// dropped when writing to BigQuery. Otherwise, the schemas must be kept in + /// sync and any messages with extra fields are not written and remain in the + /// subscription's backlog. + @$pb.TagNumber(4) + $core.bool get dropUnknownFields => $_getBF(3); + @$pb.TagNumber(4) + set dropUnknownFields($core.bool v) { + $_setBool(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasDropUnknownFields() => $_has(3); + @$pb.TagNumber(4) + void clearDropUnknownFields() => $_clearField(4); + + /// Output only. An output-only field that indicates whether or not the + /// subscription can receive messages. + @$pb.TagNumber(5) + BigQueryConfig_State get state => $_getN(4); + @$pb.TagNumber(5) + set state(BigQueryConfig_State v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasState() => $_has(4); + @$pb.TagNumber(5) + void clearState() => $_clearField(5); + + /// Optional. When true, use the BigQuery table's schema as the columns to + /// write to in BigQuery. `use_table_schema` and `use_topic_schema` cannot be + /// enabled at the same time. + @$pb.TagNumber(6) + $core.bool get useTableSchema => $_getBF(5); + @$pb.TagNumber(6) + set useTableSchema($core.bool v) { + $_setBool(5, v); + } + + @$pb.TagNumber(6) + $core.bool hasUseTableSchema() => $_has(5); + @$pb.TagNumber(6) + void clearUseTableSchema() => $_clearField(6); + + /// Optional. The service account to use to write to BigQuery. The subscription + /// creator or updater that specifies this field must have + /// `iam.serviceAccounts.actAs` permission on the service account. If not + /// specified, the Pub/Sub [service + /// agent](https://cloud.google.com/iam/docs/service-agents), + /// service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used. + @$pb.TagNumber(7) + $core.String get serviceAccountEmail => $_getSZ(6); + @$pb.TagNumber(7) + set serviceAccountEmail($core.String v) { + $_setString(6, v); + } + + @$pb.TagNumber(7) + $core.bool hasServiceAccountEmail() => $_has(6); + @$pb.TagNumber(7) + void clearServiceAccountEmail() => $_clearField(7); +} + +/// Configuration for a Bigtable subscription. The Pub/Sub message will be +/// written to a Bigtable row as follows: +/// - row key: subscription name and message ID delimited by #. +/// - columns: message bytes written to a single column family "data" with an +/// empty-string column qualifier. +/// - cell timestamp: the message publish timestamp. +class BigtableConfig extends $pb.GeneratedMessage { + factory BigtableConfig({ + $core.String? table, + $core.String? appProfileId, + $core.String? serviceAccountEmail, + BigtableConfig_State? state, + $core.bool? writeMetadata, + }) { + final $result = create(); + if (table != null) { + $result.table = table; + } + if (appProfileId != null) { + $result.appProfileId = appProfileId; + } + if (serviceAccountEmail != null) { + $result.serviceAccountEmail = serviceAccountEmail; + } + if (state != null) { + $result.state = state; + } + if (writeMetadata != null) { + $result.writeMetadata = writeMetadata; + } + return $result; + } + BigtableConfig._() : super(); + factory BigtableConfig.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory BigtableConfig.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BigtableConfig', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'table') + ..aOS(2, _omitFieldNames ? '' : 'appProfileId') + ..aOS(3, _omitFieldNames ? '' : 'serviceAccountEmail') + ..e( + 4, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: BigtableConfig_State.STATE_UNSPECIFIED, + valueOf: BigtableConfig_State.valueOf, + enumValues: BigtableConfig_State.values) + ..aOB(5, _omitFieldNames ? '' : 'writeMetadata') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BigtableConfig clone() => BigtableConfig()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BigtableConfig copyWith(void Function(BigtableConfig) updates) => + super.copyWith((message) => updates(message as BigtableConfig)) + as BigtableConfig; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BigtableConfig create() => BigtableConfig._(); + BigtableConfig createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static BigtableConfig getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static BigtableConfig? _defaultInstance; + + /// Optional. The unique name of the table to write messages to. + /// + /// Values are of the form + /// `projects//instances//tables/`. + @$pb.TagNumber(1) + $core.String get table => $_getSZ(0); + @$pb.TagNumber(1) + set table($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasTable() => $_has(0); + @$pb.TagNumber(1) + void clearTable() => $_clearField(1); + + /// Optional. The app profile to use for the Bigtable writes. If not specified, + /// the "default" application profile will be used. The app profile must use + /// single-cluster routing. + @$pb.TagNumber(2) + $core.String get appProfileId => $_getSZ(1); + @$pb.TagNumber(2) + set appProfileId($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasAppProfileId() => $_has(1); + @$pb.TagNumber(2) + void clearAppProfileId() => $_clearField(2); + + /// Optional. The service account to use to write to Bigtable. The subscription + /// creator or updater that specifies this field must have + /// `iam.serviceAccounts.actAs` permission on the service account. If not + /// specified, the Pub/Sub [service + /// agent](https://cloud.google.com/iam/docs/service-agents), + /// service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used. + @$pb.TagNumber(3) + $core.String get serviceAccountEmail => $_getSZ(2); + @$pb.TagNumber(3) + set serviceAccountEmail($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasServiceAccountEmail() => $_has(2); + @$pb.TagNumber(3) + void clearServiceAccountEmail() => $_clearField(3); + + /// Output only. An output-only field that indicates whether or not the + /// subscription can receive messages. + @$pb.TagNumber(4) + BigtableConfig_State get state => $_getN(3); + @$pb.TagNumber(4) + set state(BigtableConfig_State v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasState() => $_has(3); + @$pb.TagNumber(4) + void clearState() => $_clearField(4); + + /// Optional. When true, write the subscription name, message_id, publish_time, + /// attributes, and ordering_key to additional columns in the table under the + /// pubsub_metadata column family. The subscription name, message_id, and + /// publish_time fields are put in their own columns while all other message + /// properties (other than data) are written to a JSON object in the attributes + /// column. + @$pb.TagNumber(5) + $core.bool get writeMetadata => $_getBF(4); + @$pb.TagNumber(5) + set writeMetadata($core.bool v) { + $_setBool(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasWriteMetadata() => $_has(4); + @$pb.TagNumber(5) + void clearWriteMetadata() => $_clearField(5); +} + +/// Configuration for writing message data in text format. +/// Message payloads will be written to files as raw text, separated by a +/// newline. +class CloudStorageConfig_TextConfig extends $pb.GeneratedMessage { + factory CloudStorageConfig_TextConfig() => create(); + CloudStorageConfig_TextConfig._() : super(); + factory CloudStorageConfig_TextConfig.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory CloudStorageConfig_TextConfig.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CloudStorageConfig.TextConfig', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CloudStorageConfig_TextConfig clone() => + CloudStorageConfig_TextConfig()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CloudStorageConfig_TextConfig copyWith( + void Function(CloudStorageConfig_TextConfig) updates) => + super.copyWith( + (message) => updates(message as CloudStorageConfig_TextConfig)) + as CloudStorageConfig_TextConfig; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CloudStorageConfig_TextConfig create() => + CloudStorageConfig_TextConfig._(); + CloudStorageConfig_TextConfig createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CloudStorageConfig_TextConfig getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CloudStorageConfig_TextConfig? _defaultInstance; +} + +/// Configuration for writing message data in Avro format. +/// Message payloads and metadata will be written to files as an Avro binary. +class CloudStorageConfig_AvroConfig extends $pb.GeneratedMessage { + factory CloudStorageConfig_AvroConfig({ + $core.bool? writeMetadata, + $core.bool? useTopicSchema, + }) { + final $result = create(); + if (writeMetadata != null) { + $result.writeMetadata = writeMetadata; + } + if (useTopicSchema != null) { + $result.useTopicSchema = useTopicSchema; + } + return $result; + } + CloudStorageConfig_AvroConfig._() : super(); + factory CloudStorageConfig_AvroConfig.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory CloudStorageConfig_AvroConfig.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CloudStorageConfig.AvroConfig', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOB(1, _omitFieldNames ? '' : 'writeMetadata') + ..aOB(2, _omitFieldNames ? '' : 'useTopicSchema') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CloudStorageConfig_AvroConfig clone() => + CloudStorageConfig_AvroConfig()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CloudStorageConfig_AvroConfig copyWith( + void Function(CloudStorageConfig_AvroConfig) updates) => + super.copyWith( + (message) => updates(message as CloudStorageConfig_AvroConfig)) + as CloudStorageConfig_AvroConfig; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CloudStorageConfig_AvroConfig create() => + CloudStorageConfig_AvroConfig._(); + CloudStorageConfig_AvroConfig createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CloudStorageConfig_AvroConfig getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CloudStorageConfig_AvroConfig? _defaultInstance; + + /// Optional. When true, write the subscription name, message_id, + /// publish_time, attributes, and ordering_key as additional fields in the + /// output. The subscription name, message_id, and publish_time fields are + /// put in their own fields while all other message properties other than + /// data (for example, an ordering_key, if present) are added as entries in + /// the attributes map. + @$pb.TagNumber(1) + $core.bool get writeMetadata => $_getBF(0); + @$pb.TagNumber(1) + set writeMetadata($core.bool v) { + $_setBool(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasWriteMetadata() => $_has(0); + @$pb.TagNumber(1) + void clearWriteMetadata() => $_clearField(1); + + /// Optional. When true, the output Cloud Storage file will be serialized + /// using the topic schema, if it exists. + @$pb.TagNumber(2) + $core.bool get useTopicSchema => $_getBF(1); + @$pb.TagNumber(2) + set useTopicSchema($core.bool v) { + $_setBool(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasUseTopicSchema() => $_has(1); + @$pb.TagNumber(2) + void clearUseTopicSchema() => $_clearField(2); +} + +enum CloudStorageConfig_OutputFormat { textConfig, avroConfig, notSet } + +/// Configuration for a Cloud Storage subscription. +class CloudStorageConfig extends $pb.GeneratedMessage { + factory CloudStorageConfig({ + $core.String? bucket, + $core.String? filenamePrefix, + $core.String? filenameSuffix, + CloudStorageConfig_TextConfig? textConfig, + CloudStorageConfig_AvroConfig? avroConfig, + $5.Duration? maxDuration, + $fixnum.Int64? maxBytes, + $fixnum.Int64? maxMessages, + CloudStorageConfig_State? state, + $core.String? filenameDatetimeFormat, + $core.String? serviceAccountEmail, + }) { + final $result = create(); + if (bucket != null) { + $result.bucket = bucket; + } + if (filenamePrefix != null) { + $result.filenamePrefix = filenamePrefix; + } + if (filenameSuffix != null) { + $result.filenameSuffix = filenameSuffix; + } + if (textConfig != null) { + $result.textConfig = textConfig; + } + if (avroConfig != null) { + $result.avroConfig = avroConfig; + } + if (maxDuration != null) { + $result.maxDuration = maxDuration; + } + if (maxBytes != null) { + $result.maxBytes = maxBytes; + } + if (maxMessages != null) { + $result.maxMessages = maxMessages; + } + if (state != null) { + $result.state = state; + } + if (filenameDatetimeFormat != null) { + $result.filenameDatetimeFormat = filenameDatetimeFormat; + } + if (serviceAccountEmail != null) { + $result.serviceAccountEmail = serviceAccountEmail; + } + return $result; + } + CloudStorageConfig._() : super(); + factory CloudStorageConfig.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory CloudStorageConfig.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, CloudStorageConfig_OutputFormat> + _CloudStorageConfig_OutputFormatByTag = { + 4: CloudStorageConfig_OutputFormat.textConfig, + 5: CloudStorageConfig_OutputFormat.avroConfig, + 0: CloudStorageConfig_OutputFormat.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CloudStorageConfig', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [4, 5]) + ..aOS(1, _omitFieldNames ? '' : 'bucket') + ..aOS(2, _omitFieldNames ? '' : 'filenamePrefix') + ..aOS(3, _omitFieldNames ? '' : 'filenameSuffix') + ..aOM(4, _omitFieldNames ? '' : 'textConfig', + subBuilder: CloudStorageConfig_TextConfig.create) + ..aOM(5, _omitFieldNames ? '' : 'avroConfig', + subBuilder: CloudStorageConfig_AvroConfig.create) + ..aOM<$5.Duration>(6, _omitFieldNames ? '' : 'maxDuration', + subBuilder: $5.Duration.create) + ..aInt64(7, _omitFieldNames ? '' : 'maxBytes') + ..aInt64(8, _omitFieldNames ? '' : 'maxMessages') + ..e( + 9, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, + defaultOrMaker: CloudStorageConfig_State.STATE_UNSPECIFIED, + valueOf: CloudStorageConfig_State.valueOf, + enumValues: CloudStorageConfig_State.values) + ..aOS(10, _omitFieldNames ? '' : 'filenameDatetimeFormat') + ..aOS(11, _omitFieldNames ? '' : 'serviceAccountEmail') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CloudStorageConfig clone() => CloudStorageConfig()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CloudStorageConfig copyWith(void Function(CloudStorageConfig) updates) => + super.copyWith((message) => updates(message as CloudStorageConfig)) + as CloudStorageConfig; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CloudStorageConfig create() => CloudStorageConfig._(); + CloudStorageConfig createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CloudStorageConfig getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CloudStorageConfig? _defaultInstance; + + CloudStorageConfig_OutputFormat whichOutputFormat() => + _CloudStorageConfig_OutputFormatByTag[$_whichOneof(0)]!; + void clearOutputFormat() => $_clearField($_whichOneof(0)); + + /// Required. User-provided name for the Cloud Storage bucket. + /// The bucket must be created by the user. The bucket name must be without + /// any prefix like "gs://". See the [bucket naming + /// requirements] (https://cloud.google.com/storage/docs/buckets#naming). + @$pb.TagNumber(1) + $core.String get bucket => $_getSZ(0); + @$pb.TagNumber(1) + set bucket($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasBucket() => $_has(0); + @$pb.TagNumber(1) + void clearBucket() => $_clearField(1); + + /// Optional. User-provided prefix for Cloud Storage filename. See the [object + /// naming requirements](https://cloud.google.com/storage/docs/objects#naming). + @$pb.TagNumber(2) + $core.String get filenamePrefix => $_getSZ(1); + @$pb.TagNumber(2) + set filenamePrefix($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasFilenamePrefix() => $_has(1); + @$pb.TagNumber(2) + void clearFilenamePrefix() => $_clearField(2); + + /// Optional. User-provided suffix for Cloud Storage filename. See the [object + /// naming requirements](https://cloud.google.com/storage/docs/objects#naming). + /// Must not end in "/". + @$pb.TagNumber(3) + $core.String get filenameSuffix => $_getSZ(2); + @$pb.TagNumber(3) + set filenameSuffix($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasFilenameSuffix() => $_has(2); + @$pb.TagNumber(3) + void clearFilenameSuffix() => $_clearField(3); + + /// Optional. If set, message data will be written to Cloud Storage in text + /// format. + @$pb.TagNumber(4) + CloudStorageConfig_TextConfig get textConfig => $_getN(3); + @$pb.TagNumber(4) + set textConfig(CloudStorageConfig_TextConfig v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasTextConfig() => $_has(3); + @$pb.TagNumber(4) + void clearTextConfig() => $_clearField(4); + @$pb.TagNumber(4) + CloudStorageConfig_TextConfig ensureTextConfig() => $_ensure(3); + + /// Optional. If set, message data will be written to Cloud Storage in Avro + /// format. + @$pb.TagNumber(5) + CloudStorageConfig_AvroConfig get avroConfig => $_getN(4); + @$pb.TagNumber(5) + set avroConfig(CloudStorageConfig_AvroConfig v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasAvroConfig() => $_has(4); + @$pb.TagNumber(5) + void clearAvroConfig() => $_clearField(5); + @$pb.TagNumber(5) + CloudStorageConfig_AvroConfig ensureAvroConfig() => $_ensure(4); + + /// Optional. The maximum duration that can elapse before a new Cloud Storage + /// file is created. Min 1 minute, max 10 minutes, default 5 minutes. May not + /// exceed the subscription's acknowledgment deadline. + @$pb.TagNumber(6) + $5.Duration get maxDuration => $_getN(5); + @$pb.TagNumber(6) + set maxDuration($5.Duration v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasMaxDuration() => $_has(5); + @$pb.TagNumber(6) + void clearMaxDuration() => $_clearField(6); + @$pb.TagNumber(6) + $5.Duration ensureMaxDuration() => $_ensure(5); + + /// Optional. The maximum bytes that can be written to a Cloud Storage file + /// before a new file is created. Min 1 KB, max 10 GiB. The max_bytes limit may + /// be exceeded in cases where messages are larger than the limit. + @$pb.TagNumber(7) + $fixnum.Int64 get maxBytes => $_getI64(6); + @$pb.TagNumber(7) + set maxBytes($fixnum.Int64 v) { + $_setInt64(6, v); + } + + @$pb.TagNumber(7) + $core.bool hasMaxBytes() => $_has(6); + @$pb.TagNumber(7) + void clearMaxBytes() => $_clearField(7); + + /// Optional. The maximum number of messages that can be written to a Cloud + /// Storage file before a new file is created. Min 1000 messages. + @$pb.TagNumber(8) + $fixnum.Int64 get maxMessages => $_getI64(7); + @$pb.TagNumber(8) + set maxMessages($fixnum.Int64 v) { + $_setInt64(7, v); + } + + @$pb.TagNumber(8) + $core.bool hasMaxMessages() => $_has(7); + @$pb.TagNumber(8) + void clearMaxMessages() => $_clearField(8); + + /// Output only. An output-only field that indicates whether or not the + /// subscription can receive messages. + @$pb.TagNumber(9) + CloudStorageConfig_State get state => $_getN(8); + @$pb.TagNumber(9) + set state(CloudStorageConfig_State v) { + $_setField(9, v); + } + + @$pb.TagNumber(9) + $core.bool hasState() => $_has(8); + @$pb.TagNumber(9) + void clearState() => $_clearField(9); + + /// Optional. User-provided format string specifying how to represent datetimes + /// in Cloud Storage filenames. See the [datetime format + /// guidance](https://cloud.google.com/pubsub/docs/create-cloudstorage-subscription#file_names). + @$pb.TagNumber(10) + $core.String get filenameDatetimeFormat => $_getSZ(9); + @$pb.TagNumber(10) + set filenameDatetimeFormat($core.String v) { + $_setString(9, v); + } + + @$pb.TagNumber(10) + $core.bool hasFilenameDatetimeFormat() => $_has(9); + @$pb.TagNumber(10) + void clearFilenameDatetimeFormat() => $_clearField(10); + + /// Optional. The service account to use to write to Cloud Storage. The + /// subscription creator or updater that specifies this field must have + /// `iam.serviceAccounts.actAs` permission on the service account. If not + /// specified, the Pub/Sub + /// [service agent](https://cloud.google.com/iam/docs/service-agents), + /// service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used. + @$pb.TagNumber(11) + $core.String get serviceAccountEmail => $_getSZ(10); + @$pb.TagNumber(11) + set serviceAccountEmail($core.String v) { + $_setString(10, v); + } + + @$pb.TagNumber(11) + $core.bool hasServiceAccountEmail() => $_has(10); + @$pb.TagNumber(11) + void clearServiceAccountEmail() => $_clearField(11); +} + +/// A message and its corresponding acknowledgment ID. +class ReceivedMessage extends $pb.GeneratedMessage { + factory ReceivedMessage({ + $core.String? ackId, + PubsubMessage? message, + $core.int? deliveryAttempt, + }) { + final $result = create(); + if (ackId != null) { + $result.ackId = ackId; + } + if (message != null) { + $result.message = message; + } + if (deliveryAttempt != null) { + $result.deliveryAttempt = deliveryAttempt; + } + return $result; + } + ReceivedMessage._() : super(); + factory ReceivedMessage.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ReceivedMessage.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ReceivedMessage', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'ackId') + ..aOM(2, _omitFieldNames ? '' : 'message', + subBuilder: PubsubMessage.create) + ..a<$core.int>( + 3, _omitFieldNames ? '' : 'deliveryAttempt', $pb.PbFieldType.O3) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ReceivedMessage clone() => ReceivedMessage()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ReceivedMessage copyWith(void Function(ReceivedMessage) updates) => + super.copyWith((message) => updates(message as ReceivedMessage)) + as ReceivedMessage; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ReceivedMessage create() => ReceivedMessage._(); + ReceivedMessage createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ReceivedMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ReceivedMessage? _defaultInstance; + + /// Optional. This ID can be used to acknowledge the received message. + @$pb.TagNumber(1) + $core.String get ackId => $_getSZ(0); + @$pb.TagNumber(1) + set ackId($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasAckId() => $_has(0); + @$pb.TagNumber(1) + void clearAckId() => $_clearField(1); + + /// Optional. The message. + @$pb.TagNumber(2) + PubsubMessage get message => $_getN(1); + @$pb.TagNumber(2) + set message(PubsubMessage v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasMessage() => $_has(1); + @$pb.TagNumber(2) + void clearMessage() => $_clearField(2); + @$pb.TagNumber(2) + PubsubMessage ensureMessage() => $_ensure(1); + + /// Optional. The approximate number of times that Pub/Sub has attempted to + /// deliver the associated message to a subscriber. + /// + /// More precisely, this is 1 + (number of NACKs) + + /// (number of ack_deadline exceeds) for this message. + /// + /// A NACK is any call to ModifyAckDeadline with a 0 deadline. An ack_deadline + /// exceeds event is whenever a message is not acknowledged within + /// ack_deadline. Note that ack_deadline is initially + /// Subscription.ackDeadlineSeconds, but may get extended automatically by + /// the client library. + /// + /// Upon the first delivery of a given message, `delivery_attempt` will have a + /// value of 1. The value is calculated at best effort and is approximate. + /// + /// If a DeadLetterPolicy is not set on the subscription, this will be 0. + @$pb.TagNumber(3) + $core.int get deliveryAttempt => $_getIZ(2); + @$pb.TagNumber(3) + set deliveryAttempt($core.int v) { + $_setSignedInt32(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasDeliveryAttempt() => $_has(2); + @$pb.TagNumber(3) + void clearDeliveryAttempt() => $_clearField(3); +} + +/// Request for the GetSubscription method. +class GetSubscriptionRequest extends $pb.GeneratedMessage { + factory GetSubscriptionRequest({ + $core.String? subscription, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + return $result; + } + GetSubscriptionRequest._() : super(); + factory GetSubscriptionRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory GetSubscriptionRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'GetSubscriptionRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetSubscriptionRequest clone() => + GetSubscriptionRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetSubscriptionRequest copyWith( + void Function(GetSubscriptionRequest) updates) => + super.copyWith((message) => updates(message as GetSubscriptionRequest)) + as GetSubscriptionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static GetSubscriptionRequest create() => GetSubscriptionRequest._(); + GetSubscriptionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GetSubscriptionRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static GetSubscriptionRequest? _defaultInstance; + + /// Required. The name of the subscription to get. + /// Format is `projects/{project}/subscriptions/{sub}`. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); +} + +/// Request for the UpdateSubscription method. +class UpdateSubscriptionRequest extends $pb.GeneratedMessage { + factory UpdateSubscriptionRequest({ + Subscription? subscription, + $6.FieldMask? updateMask, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + if (updateMask != null) { + $result.updateMask = updateMask; + } + return $result; + } + UpdateSubscriptionRequest._() : super(); + factory UpdateSubscriptionRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory UpdateSubscriptionRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'UpdateSubscriptionRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'subscription', + subBuilder: Subscription.create) + ..aOM<$6.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', + subBuilder: $6.FieldMask.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + UpdateSubscriptionRequest clone() => + UpdateSubscriptionRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + UpdateSubscriptionRequest copyWith( + void Function(UpdateSubscriptionRequest) updates) => + super.copyWith((message) => updates(message as UpdateSubscriptionRequest)) + as UpdateSubscriptionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static UpdateSubscriptionRequest create() => UpdateSubscriptionRequest._(); + UpdateSubscriptionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static UpdateSubscriptionRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static UpdateSubscriptionRequest? _defaultInstance; + + /// Required. The updated subscription object. + @$pb.TagNumber(1) + Subscription get subscription => $_getN(0); + @$pb.TagNumber(1) + set subscription(Subscription v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); + @$pb.TagNumber(1) + Subscription ensureSubscription() => $_ensure(0); + + /// Required. Indicates which fields in the provided subscription to update. + /// Must be specified and non-empty. + @$pb.TagNumber(2) + $6.FieldMask get updateMask => $_getN(1); + @$pb.TagNumber(2) + set updateMask($6.FieldMask v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasUpdateMask() => $_has(1); + @$pb.TagNumber(2) + void clearUpdateMask() => $_clearField(2); + @$pb.TagNumber(2) + $6.FieldMask ensureUpdateMask() => $_ensure(1); +} + +/// Request for the `ListSubscriptions` method. +class ListSubscriptionsRequest extends $pb.GeneratedMessage { + factory ListSubscriptionsRequest({ + $core.String? project, + $core.int? pageSize, + $core.String? pageToken, + }) { + final $result = create(); + if (project != null) { + $result.project = project; + } + if (pageSize != null) { + $result.pageSize = pageSize; + } + if (pageToken != null) { + $result.pageToken = pageToken; + } + return $result; + } + ListSubscriptionsRequest._() : super(); + factory ListSubscriptionsRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListSubscriptionsRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListSubscriptionsRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'project') + ..a<$core.int>(2, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.O3) + ..aOS(3, _omitFieldNames ? '' : 'pageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSubscriptionsRequest clone() => + ListSubscriptionsRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSubscriptionsRequest copyWith( + void Function(ListSubscriptionsRequest) updates) => + super.copyWith((message) => updates(message as ListSubscriptionsRequest)) + as ListSubscriptionsRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSubscriptionsRequest create() => ListSubscriptionsRequest._(); + ListSubscriptionsRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSubscriptionsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListSubscriptionsRequest? _defaultInstance; + + /// Required. The name of the project in which to list subscriptions. + /// Format is `projects/{project-id}`. + @$pb.TagNumber(1) + $core.String get project => $_getSZ(0); + @$pb.TagNumber(1) + set project($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasProject() => $_has(0); + @$pb.TagNumber(1) + void clearProject() => $_clearField(1); + + /// Optional. Maximum number of subscriptions to return. + @$pb.TagNumber(2) + $core.int get pageSize => $_getIZ(1); + @$pb.TagNumber(2) + set pageSize($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPageSize() => $_has(1); + @$pb.TagNumber(2) + void clearPageSize() => $_clearField(2); + + /// Optional. The value returned by the last `ListSubscriptionsResponse`; + /// indicates that this is a continuation of a prior `ListSubscriptions` call, + /// and that the system should return the next page of data. + @$pb.TagNumber(3) + $core.String get pageToken => $_getSZ(2); + @$pb.TagNumber(3) + set pageToken($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPageToken() => $_has(2); + @$pb.TagNumber(3) + void clearPageToken() => $_clearField(3); +} + +/// Response for the `ListSubscriptions` method. +class ListSubscriptionsResponse extends $pb.GeneratedMessage { + factory ListSubscriptionsResponse({ + $core.Iterable? subscriptions, + $core.String? nextPageToken, + }) { + final $result = create(); + if (subscriptions != null) { + $result.subscriptions.addAll(subscriptions); + } + if (nextPageToken != null) { + $result.nextPageToken = nextPageToken; + } + return $result; + } + ListSubscriptionsResponse._() : super(); + factory ListSubscriptionsResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListSubscriptionsResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListSubscriptionsResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pc( + 1, _omitFieldNames ? '' : 'subscriptions', $pb.PbFieldType.PM, + subBuilder: Subscription.create) + ..aOS(2, _omitFieldNames ? '' : 'nextPageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSubscriptionsResponse clone() => + ListSubscriptionsResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSubscriptionsResponse copyWith( + void Function(ListSubscriptionsResponse) updates) => + super.copyWith((message) => updates(message as ListSubscriptionsResponse)) + as ListSubscriptionsResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSubscriptionsResponse create() => ListSubscriptionsResponse._(); + ListSubscriptionsResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSubscriptionsResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListSubscriptionsResponse? _defaultInstance; + + /// Optional. The subscriptions that match the request. + @$pb.TagNumber(1) + $pb.PbList get subscriptions => $_getList(0); + + /// Optional. If not empty, indicates that there may be more subscriptions that + /// match the request; this value should be passed in a new + /// `ListSubscriptionsRequest` to get more subscriptions. + @$pb.TagNumber(2) + $core.String get nextPageToken => $_getSZ(1); + @$pb.TagNumber(2) + set nextPageToken($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNextPageToken() => $_has(1); + @$pb.TagNumber(2) + void clearNextPageToken() => $_clearField(2); +} + +/// Request for the DeleteSubscription method. +class DeleteSubscriptionRequest extends $pb.GeneratedMessage { + factory DeleteSubscriptionRequest({ + $core.String? subscription, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + return $result; + } + DeleteSubscriptionRequest._() : super(); + factory DeleteSubscriptionRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DeleteSubscriptionRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DeleteSubscriptionRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteSubscriptionRequest clone() => + DeleteSubscriptionRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteSubscriptionRequest copyWith( + void Function(DeleteSubscriptionRequest) updates) => + super.copyWith((message) => updates(message as DeleteSubscriptionRequest)) + as DeleteSubscriptionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DeleteSubscriptionRequest create() => DeleteSubscriptionRequest._(); + DeleteSubscriptionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DeleteSubscriptionRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DeleteSubscriptionRequest? _defaultInstance; + + /// Required. The subscription to delete. + /// Format is `projects/{project}/subscriptions/{sub}`. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); +} + +/// Request for the ModifyPushConfig method. +class ModifyPushConfigRequest extends $pb.GeneratedMessage { + factory ModifyPushConfigRequest({ + $core.String? subscription, + PushConfig? pushConfig, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + if (pushConfig != null) { + $result.pushConfig = pushConfig; + } + return $result; + } + ModifyPushConfigRequest._() : super(); + factory ModifyPushConfigRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ModifyPushConfigRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ModifyPushConfigRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..aOM(2, _omitFieldNames ? '' : 'pushConfig', + subBuilder: PushConfig.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ModifyPushConfigRequest clone() => + ModifyPushConfigRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ModifyPushConfigRequest copyWith( + void Function(ModifyPushConfigRequest) updates) => + super.copyWith((message) => updates(message as ModifyPushConfigRequest)) + as ModifyPushConfigRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ModifyPushConfigRequest create() => ModifyPushConfigRequest._(); + ModifyPushConfigRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ModifyPushConfigRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ModifyPushConfigRequest? _defaultInstance; + + /// Required. The name of the subscription. + /// Format is `projects/{project}/subscriptions/{sub}`. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); + + /// Required. The push configuration for future deliveries. + /// + /// An empty `pushConfig` indicates that the Pub/Sub system should + /// stop pushing messages from the given subscription and allow + /// messages to be pulled and acknowledged - effectively pausing + /// the subscription if `Pull` or `StreamingPull` is not called. + @$pb.TagNumber(2) + PushConfig get pushConfig => $_getN(1); + @$pb.TagNumber(2) + set pushConfig(PushConfig v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasPushConfig() => $_has(1); + @$pb.TagNumber(2) + void clearPushConfig() => $_clearField(2); + @$pb.TagNumber(2) + PushConfig ensurePushConfig() => $_ensure(1); +} + +/// Request for the `Pull` method. +class PullRequest extends $pb.GeneratedMessage { + factory PullRequest({ + $core.String? subscription, + @$core.Deprecated('This field is deprecated.') + $core.bool? returnImmediately, + $core.int? maxMessages, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + if (returnImmediately != null) { + // ignore: deprecated_member_use_from_same_package + $result.returnImmediately = returnImmediately; + } + if (maxMessages != null) { + $result.maxMessages = maxMessages; + } + return $result; + } + PullRequest._() : super(); + factory PullRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PullRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PullRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..aOB(2, _omitFieldNames ? '' : 'returnImmediately') + ..a<$core.int>(3, _omitFieldNames ? '' : 'maxMessages', $pb.PbFieldType.O3) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PullRequest clone() => PullRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PullRequest copyWith(void Function(PullRequest) updates) => + super.copyWith((message) => updates(message as PullRequest)) + as PullRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PullRequest create() => PullRequest._(); + PullRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PullRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PullRequest? _defaultInstance; + + /// Required. The subscription from which messages should be pulled. + /// Format is `projects/{project}/subscriptions/{sub}`. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); + + /// Optional. If this field set to true, the system will respond immediately + /// even if it there are no messages available to return in the `Pull` + /// response. Otherwise, the system may wait (for a bounded amount of time) + /// until at least one message is available, rather than returning no messages. + /// Warning: setting this field to `true` is discouraged because it adversely + /// impacts the performance of `Pull` operations. We recommend that users do + /// not set this field. + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(2) + $core.bool get returnImmediately => $_getBF(1); + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(2) + set returnImmediately($core.bool v) { + $_setBool(1, v); + } + + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(2) + $core.bool hasReturnImmediately() => $_has(1); + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(2) + void clearReturnImmediately() => $_clearField(2); + + /// Required. The maximum number of messages to return for this request. Must + /// be a positive integer. The Pub/Sub system may return fewer than the number + /// specified. + @$pb.TagNumber(3) + $core.int get maxMessages => $_getIZ(2); + @$pb.TagNumber(3) + set maxMessages($core.int v) { + $_setSignedInt32(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasMaxMessages() => $_has(2); + @$pb.TagNumber(3) + void clearMaxMessages() => $_clearField(3); +} + +/// Response for the `Pull` method. +class PullResponse extends $pb.GeneratedMessage { + factory PullResponse({ + $core.Iterable? receivedMessages, + }) { + final $result = create(); + if (receivedMessages != null) { + $result.receivedMessages.addAll(receivedMessages); + } + return $result; + } + PullResponse._() : super(); + factory PullResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory PullResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'PullResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pc( + 1, _omitFieldNames ? '' : 'receivedMessages', $pb.PbFieldType.PM, + subBuilder: ReceivedMessage.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PullResponse clone() => PullResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + PullResponse copyWith(void Function(PullResponse) updates) => + super.copyWith((message) => updates(message as PullResponse)) + as PullResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PullResponse create() => PullResponse._(); + PullResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PullResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static PullResponse? _defaultInstance; + + /// Optional. Received Pub/Sub messages. The list will be empty if there are no + /// more messages available in the backlog, or if no messages could be returned + /// before the request timeout. For JSON, the response can be entirely + /// empty. The Pub/Sub system may return fewer than the `maxMessages` requested + /// even if there are more messages available in the backlog. + @$pb.TagNumber(1) + $pb.PbList get receivedMessages => $_getList(0); +} + +/// Request for the ModifyAckDeadline method. +class ModifyAckDeadlineRequest extends $pb.GeneratedMessage { + factory ModifyAckDeadlineRequest({ + $core.String? subscription, + $core.int? ackDeadlineSeconds, + $core.Iterable<$core.String>? ackIds, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + if (ackDeadlineSeconds != null) { + $result.ackDeadlineSeconds = ackDeadlineSeconds; + } + if (ackIds != null) { + $result.ackIds.addAll(ackIds); + } + return $result; + } + ModifyAckDeadlineRequest._() : super(); + factory ModifyAckDeadlineRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ModifyAckDeadlineRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ModifyAckDeadlineRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..a<$core.int>( + 3, _omitFieldNames ? '' : 'ackDeadlineSeconds', $pb.PbFieldType.O3) + ..pPS(4, _omitFieldNames ? '' : 'ackIds') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ModifyAckDeadlineRequest clone() => + ModifyAckDeadlineRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ModifyAckDeadlineRequest copyWith( + void Function(ModifyAckDeadlineRequest) updates) => + super.copyWith((message) => updates(message as ModifyAckDeadlineRequest)) + as ModifyAckDeadlineRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ModifyAckDeadlineRequest create() => ModifyAckDeadlineRequest._(); + ModifyAckDeadlineRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ModifyAckDeadlineRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ModifyAckDeadlineRequest? _defaultInstance; + + /// Required. The name of the subscription. + /// Format is `projects/{project}/subscriptions/{sub}`. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); + + /// Required. The new ack deadline with respect to the time this request was + /// sent to the Pub/Sub system. For example, if the value is 10, the new ack + /// deadline will expire 10 seconds after the `ModifyAckDeadline` call was + /// made. Specifying zero might immediately make the message available for + /// delivery to another subscriber client. This typically results in an + /// increase in the rate of message redeliveries (that is, duplicates). + /// The minimum deadline you can specify is 0 seconds. + /// The maximum deadline you can specify in a single request is 600 seconds + /// (10 minutes). + @$pb.TagNumber(3) + $core.int get ackDeadlineSeconds => $_getIZ(1); + @$pb.TagNumber(3) + set ackDeadlineSeconds($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(3) + $core.bool hasAckDeadlineSeconds() => $_has(1); + @$pb.TagNumber(3) + void clearAckDeadlineSeconds() => $_clearField(3); + + /// Required. List of acknowledgment IDs. + @$pb.TagNumber(4) + $pb.PbList<$core.String> get ackIds => $_getList(2); +} + +/// Request for the Acknowledge method. +class AcknowledgeRequest extends $pb.GeneratedMessage { + factory AcknowledgeRequest({ + $core.String? subscription, + $core.Iterable<$core.String>? ackIds, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + if (ackIds != null) { + $result.ackIds.addAll(ackIds); + } + return $result; + } + AcknowledgeRequest._() : super(); + factory AcknowledgeRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory AcknowledgeRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'AcknowledgeRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..pPS(2, _omitFieldNames ? '' : 'ackIds') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AcknowledgeRequest clone() => AcknowledgeRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AcknowledgeRequest copyWith(void Function(AcknowledgeRequest) updates) => + super.copyWith((message) => updates(message as AcknowledgeRequest)) + as AcknowledgeRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static AcknowledgeRequest create() => AcknowledgeRequest._(); + AcknowledgeRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static AcknowledgeRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static AcknowledgeRequest? _defaultInstance; + + /// Required. The subscription whose message is being acknowledged. + /// Format is `projects/{project}/subscriptions/{sub}`. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); + + /// Required. The acknowledgment ID for the messages being acknowledged that + /// was returned by the Pub/Sub system in the `Pull` response. Must not be + /// empty. + @$pb.TagNumber(2) + $pb.PbList<$core.String> get ackIds => $_getList(1); +} + +/// Request for the `StreamingPull` streaming RPC method. This request is used to +/// establish the initial stream as well as to stream acknowledgments and ack +/// deadline modifications from the client to the server. +class StreamingPullRequest extends $pb.GeneratedMessage { + factory StreamingPullRequest({ + $core.String? subscription, + $core.Iterable<$core.String>? ackIds, + $core.Iterable<$core.int>? modifyDeadlineSeconds, + $core.Iterable<$core.String>? modifyDeadlineAckIds, + $core.int? streamAckDeadlineSeconds, + $core.String? clientId, + $fixnum.Int64? maxOutstandingMessages, + $fixnum.Int64? maxOutstandingBytes, + $fixnum.Int64? protocolVersion, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + if (ackIds != null) { + $result.ackIds.addAll(ackIds); + } + if (modifyDeadlineSeconds != null) { + $result.modifyDeadlineSeconds.addAll(modifyDeadlineSeconds); + } + if (modifyDeadlineAckIds != null) { + $result.modifyDeadlineAckIds.addAll(modifyDeadlineAckIds); + } + if (streamAckDeadlineSeconds != null) { + $result.streamAckDeadlineSeconds = streamAckDeadlineSeconds; + } + if (clientId != null) { + $result.clientId = clientId; + } + if (maxOutstandingMessages != null) { + $result.maxOutstandingMessages = maxOutstandingMessages; + } + if (maxOutstandingBytes != null) { + $result.maxOutstandingBytes = maxOutstandingBytes; + } + if (protocolVersion != null) { + $result.protocolVersion = protocolVersion; + } + return $result; + } + StreamingPullRequest._() : super(); + factory StreamingPullRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory StreamingPullRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'StreamingPullRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..pPS(2, _omitFieldNames ? '' : 'ackIds') + ..p<$core.int>( + 3, _omitFieldNames ? '' : 'modifyDeadlineSeconds', $pb.PbFieldType.K3) + ..pPS(4, _omitFieldNames ? '' : 'modifyDeadlineAckIds') + ..a<$core.int>(5, _omitFieldNames ? '' : 'streamAckDeadlineSeconds', + $pb.PbFieldType.O3) + ..aOS(6, _omitFieldNames ? '' : 'clientId') + ..aInt64(7, _omitFieldNames ? '' : 'maxOutstandingMessages') + ..aInt64(8, _omitFieldNames ? '' : 'maxOutstandingBytes') + ..aInt64(10, _omitFieldNames ? '' : 'protocolVersion') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullRequest clone() => + StreamingPullRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullRequest copyWith(void Function(StreamingPullRequest) updates) => + super.copyWith((message) => updates(message as StreamingPullRequest)) + as StreamingPullRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static StreamingPullRequest create() => StreamingPullRequest._(); + StreamingPullRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static StreamingPullRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static StreamingPullRequest? _defaultInstance; + + /// Required. The subscription for which to initialize the new stream. This + /// must be provided in the first request on the stream, and must not be set in + /// subsequent requests from client to server. + /// Format is `projects/{project}/subscriptions/{sub}`. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); + + /// Optional. List of acknowledgment IDs for acknowledging previously received + /// messages (received on this stream or a different stream). If an ack ID has + /// expired, the corresponding message may be redelivered later. Acknowledging + /// a message more than once will not result in an error. If the acknowledgment + /// ID is malformed, the stream will be aborted with status `INVALID_ARGUMENT`. + @$pb.TagNumber(2) + $pb.PbList<$core.String> get ackIds => $_getList(1); + + /// Optional. The list of new ack deadlines for the IDs listed in + /// `modify_deadline_ack_ids`. The size of this list must be the same as the + /// size of `modify_deadline_ack_ids`. If it differs the stream will be aborted + /// with `INVALID_ARGUMENT`. Each element in this list is applied to the + /// element in the same position in `modify_deadline_ack_ids`. The new ack + /// deadline is with respect to the time this request was sent to the Pub/Sub + /// system. Must be >= 0. For example, if the value is 10, the new ack deadline + /// will expire 10 seconds after this request is received. If the value is 0, + /// the message is immediately made available for another streaming or + /// non-streaming pull request. If the value is < 0 (an error), the stream will + /// be aborted with status `INVALID_ARGUMENT`. + @$pb.TagNumber(3) + $pb.PbList<$core.int> get modifyDeadlineSeconds => $_getList(2); + + /// Optional. List of acknowledgment IDs whose deadline will be modified based + /// on the corresponding element in `modify_deadline_seconds`. This field can + /// be used to indicate that more time is needed to process a message by the + /// subscriber, or to make the message available for redelivery if the + /// processing was interrupted. + @$pb.TagNumber(4) + $pb.PbList<$core.String> get modifyDeadlineAckIds => $_getList(3); + + /// Required. The ack deadline to use for the stream. This must be provided in + /// the first request on the stream, but it can also be updated on subsequent + /// requests from client to server. The minimum deadline you can specify is 10 + /// seconds. The maximum deadline you can specify is 600 seconds (10 minutes). + @$pb.TagNumber(5) + $core.int get streamAckDeadlineSeconds => $_getIZ(4); + @$pb.TagNumber(5) + set streamAckDeadlineSeconds($core.int v) { + $_setSignedInt32(4, v); + } + + @$pb.TagNumber(5) + $core.bool hasStreamAckDeadlineSeconds() => $_has(4); + @$pb.TagNumber(5) + void clearStreamAckDeadlineSeconds() => $_clearField(5); + + /// Optional. A unique identifier that is used to distinguish client instances + /// from each other. Only needs to be provided on the initial request. When a + /// stream disconnects and reconnects for the same stream, the client_id should + /// be set to the same value so that state associated with the old stream can + /// be transferred to the new stream. The same client_id should not be used for + /// different client instances. + @$pb.TagNumber(6) + $core.String get clientId => $_getSZ(5); + @$pb.TagNumber(6) + set clientId($core.String v) { + $_setString(5, v); + } + + @$pb.TagNumber(6) + $core.bool hasClientId() => $_has(5); + @$pb.TagNumber(6) + void clearClientId() => $_clearField(6); + + /// Optional. Flow control settings for the maximum number of outstanding + /// messages. When there are `max_outstanding_messages` currently sent to the + /// streaming pull client that have not yet been acked or nacked, the server + /// stops sending more messages. The sending of messages resumes once the + /// number of outstanding messages is less than this value. If the value is + /// <= 0, there is no limit to the number of outstanding messages. This + /// property can only be set on the initial StreamingPullRequest. If it is set + /// on a subsequent request, the stream will be aborted with status + /// `INVALID_ARGUMENT`. + @$pb.TagNumber(7) + $fixnum.Int64 get maxOutstandingMessages => $_getI64(6); + @$pb.TagNumber(7) + set maxOutstandingMessages($fixnum.Int64 v) { + $_setInt64(6, v); + } + + @$pb.TagNumber(7) + $core.bool hasMaxOutstandingMessages() => $_has(6); + @$pb.TagNumber(7) + void clearMaxOutstandingMessages() => $_clearField(7); + + /// Optional. Flow control settings for the maximum number of outstanding + /// bytes. When there are `max_outstanding_bytes` or more worth of messages + /// currently sent to the streaming pull client that have not yet been acked or + /// nacked, the server will stop sending more messages. The sending of messages + /// resumes once the number of outstanding bytes is less than this value. If + /// the value is <= 0, there is no limit to the number of outstanding bytes. + /// This property can only be set on the initial StreamingPullRequest. If it is + /// set on a subsequent request, the stream will be aborted with status + /// `INVALID_ARGUMENT`. + @$pb.TagNumber(8) + $fixnum.Int64 get maxOutstandingBytes => $_getI64(7); + @$pb.TagNumber(8) + set maxOutstandingBytes($fixnum.Int64 v) { + $_setInt64(7, v); + } + + @$pb.TagNumber(8) + $core.bool hasMaxOutstandingBytes() => $_has(7); + @$pb.TagNumber(8) + void clearMaxOutstandingBytes() => $_clearField(8); + + /// Optional. The protocol version used by the client. This property can only + /// be set on the initial StreamingPullRequest. If it is set on a subsequent + /// request, the stream will be aborted with status `INVALID_ARGUMENT`. + @$pb.TagNumber(10) + $fixnum.Int64 get protocolVersion => $_getI64(8); + @$pb.TagNumber(10) + set protocolVersion($fixnum.Int64 v) { + $_setInt64(8, v); + } + + @$pb.TagNumber(10) + $core.bool hasProtocolVersion() => $_has(8); + @$pb.TagNumber(10) + void clearProtocolVersion() => $_clearField(10); +} + +/// Acknowledgment IDs sent in one or more previous requests to acknowledge a +/// previously received message. +class StreamingPullResponse_AcknowledgeConfirmation + extends $pb.GeneratedMessage { + factory StreamingPullResponse_AcknowledgeConfirmation({ + $core.Iterable<$core.String>? ackIds, + $core.Iterable<$core.String>? invalidAckIds, + $core.Iterable<$core.String>? unorderedAckIds, + $core.Iterable<$core.String>? temporaryFailedAckIds, + }) { + final $result = create(); + if (ackIds != null) { + $result.ackIds.addAll(ackIds); + } + if (invalidAckIds != null) { + $result.invalidAckIds.addAll(invalidAckIds); + } + if (unorderedAckIds != null) { + $result.unorderedAckIds.addAll(unorderedAckIds); + } + if (temporaryFailedAckIds != null) { + $result.temporaryFailedAckIds.addAll(temporaryFailedAckIds); + } + return $result; + } + StreamingPullResponse_AcknowledgeConfirmation._() : super(); + factory StreamingPullResponse_AcknowledgeConfirmation.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory StreamingPullResponse_AcknowledgeConfirmation.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'StreamingPullResponse.AcknowledgeConfirmation', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pPS(1, _omitFieldNames ? '' : 'ackIds') + ..pPS(2, _omitFieldNames ? '' : 'invalidAckIds') + ..pPS(3, _omitFieldNames ? '' : 'unorderedAckIds') + ..pPS(4, _omitFieldNames ? '' : 'temporaryFailedAckIds') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullResponse_AcknowledgeConfirmation clone() => + StreamingPullResponse_AcknowledgeConfirmation()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullResponse_AcknowledgeConfirmation copyWith( + void Function(StreamingPullResponse_AcknowledgeConfirmation) + updates) => + super.copyWith((message) => + updates(message as StreamingPullResponse_AcknowledgeConfirmation)) + as StreamingPullResponse_AcknowledgeConfirmation; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static StreamingPullResponse_AcknowledgeConfirmation create() => + StreamingPullResponse_AcknowledgeConfirmation._(); + StreamingPullResponse_AcknowledgeConfirmation createEmptyInstance() => + create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static StreamingPullResponse_AcknowledgeConfirmation getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + StreamingPullResponse_AcknowledgeConfirmation>(create); + static StreamingPullResponse_AcknowledgeConfirmation? _defaultInstance; + + /// Optional. Successfully processed acknowledgment IDs. + @$pb.TagNumber(1) + $pb.PbList<$core.String> get ackIds => $_getList(0); + + /// Optional. List of acknowledgment IDs that were malformed or whose + /// acknowledgment deadline has expired. + @$pb.TagNumber(2) + $pb.PbList<$core.String> get invalidAckIds => $_getList(1); + + /// Optional. List of acknowledgment IDs that were out of order. + @$pb.TagNumber(3) + $pb.PbList<$core.String> get unorderedAckIds => $_getList(2); + + /// Optional. List of acknowledgment IDs that failed processing with + /// temporary issues. + @$pb.TagNumber(4) + $pb.PbList<$core.String> get temporaryFailedAckIds => $_getList(3); +} + +/// Acknowledgment IDs sent in one or more previous requests to modify the +/// deadline for a specific message. +class StreamingPullResponse_ModifyAckDeadlineConfirmation + extends $pb.GeneratedMessage { + factory StreamingPullResponse_ModifyAckDeadlineConfirmation({ + $core.Iterable<$core.String>? ackIds, + $core.Iterable<$core.String>? invalidAckIds, + $core.Iterable<$core.String>? temporaryFailedAckIds, + }) { + final $result = create(); + if (ackIds != null) { + $result.ackIds.addAll(ackIds); + } + if (invalidAckIds != null) { + $result.invalidAckIds.addAll(invalidAckIds); + } + if (temporaryFailedAckIds != null) { + $result.temporaryFailedAckIds.addAll(temporaryFailedAckIds); + } + return $result; + } + StreamingPullResponse_ModifyAckDeadlineConfirmation._() : super(); + factory StreamingPullResponse_ModifyAckDeadlineConfirmation.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory StreamingPullResponse_ModifyAckDeadlineConfirmation.fromJson( + $core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames + ? '' + : 'StreamingPullResponse.ModifyAckDeadlineConfirmation', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pPS(1, _omitFieldNames ? '' : 'ackIds') + ..pPS(2, _omitFieldNames ? '' : 'invalidAckIds') + ..pPS(3, _omitFieldNames ? '' : 'temporaryFailedAckIds') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullResponse_ModifyAckDeadlineConfirmation clone() => + StreamingPullResponse_ModifyAckDeadlineConfirmation() + ..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullResponse_ModifyAckDeadlineConfirmation copyWith( + void Function(StreamingPullResponse_ModifyAckDeadlineConfirmation) + updates) => + super.copyWith((message) => updates( + message as StreamingPullResponse_ModifyAckDeadlineConfirmation)) + as StreamingPullResponse_ModifyAckDeadlineConfirmation; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static StreamingPullResponse_ModifyAckDeadlineConfirmation create() => + StreamingPullResponse_ModifyAckDeadlineConfirmation._(); + StreamingPullResponse_ModifyAckDeadlineConfirmation createEmptyInstance() => + create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static StreamingPullResponse_ModifyAckDeadlineConfirmation getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + StreamingPullResponse_ModifyAckDeadlineConfirmation>(create); + static StreamingPullResponse_ModifyAckDeadlineConfirmation? _defaultInstance; + + /// Optional. Successfully processed acknowledgment IDs. + @$pb.TagNumber(1) + $pb.PbList<$core.String> get ackIds => $_getList(0); + + /// Optional. List of acknowledgment IDs that were malformed or whose + /// acknowledgment deadline has expired. + @$pb.TagNumber(2) + $pb.PbList<$core.String> get invalidAckIds => $_getList(1); + + /// Optional. List of acknowledgment IDs that failed processing with + /// temporary issues. + @$pb.TagNumber(3) + $pb.PbList<$core.String> get temporaryFailedAckIds => $_getList(2); +} + +/// Subscription properties sent as part of the response. +class StreamingPullResponse_SubscriptionProperties + extends $pb.GeneratedMessage { + factory StreamingPullResponse_SubscriptionProperties({ + $core.bool? exactlyOnceDeliveryEnabled, + $core.bool? messageOrderingEnabled, + }) { + final $result = create(); + if (exactlyOnceDeliveryEnabled != null) { + $result.exactlyOnceDeliveryEnabled = exactlyOnceDeliveryEnabled; + } + if (messageOrderingEnabled != null) { + $result.messageOrderingEnabled = messageOrderingEnabled; + } + return $result; + } + StreamingPullResponse_SubscriptionProperties._() : super(); + factory StreamingPullResponse_SubscriptionProperties.fromBuffer( + $core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory StreamingPullResponse_SubscriptionProperties.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'StreamingPullResponse.SubscriptionProperties', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOB(1, _omitFieldNames ? '' : 'exactlyOnceDeliveryEnabled') + ..aOB(2, _omitFieldNames ? '' : 'messageOrderingEnabled') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullResponse_SubscriptionProperties clone() => + StreamingPullResponse_SubscriptionProperties()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullResponse_SubscriptionProperties copyWith( + void Function(StreamingPullResponse_SubscriptionProperties) + updates) => + super.copyWith((message) => + updates(message as StreamingPullResponse_SubscriptionProperties)) + as StreamingPullResponse_SubscriptionProperties; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static StreamingPullResponse_SubscriptionProperties create() => + StreamingPullResponse_SubscriptionProperties._(); + StreamingPullResponse_SubscriptionProperties createEmptyInstance() => + create(); + static $pb.PbList + createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static StreamingPullResponse_SubscriptionProperties getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + StreamingPullResponse_SubscriptionProperties>(create); + static StreamingPullResponse_SubscriptionProperties? _defaultInstance; + + /// Optional. True iff exactly once delivery is enabled for this + /// subscription. + @$pb.TagNumber(1) + $core.bool get exactlyOnceDeliveryEnabled => $_getBF(0); + @$pb.TagNumber(1) + set exactlyOnceDeliveryEnabled($core.bool v) { + $_setBool(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasExactlyOnceDeliveryEnabled() => $_has(0); + @$pb.TagNumber(1) + void clearExactlyOnceDeliveryEnabled() => $_clearField(1); + + /// Optional. True iff message ordering is enabled for this subscription. + @$pb.TagNumber(2) + $core.bool get messageOrderingEnabled => $_getBF(1); + @$pb.TagNumber(2) + set messageOrderingEnabled($core.bool v) { + $_setBool(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasMessageOrderingEnabled() => $_has(1); + @$pb.TagNumber(2) + void clearMessageOrderingEnabled() => $_clearField(2); +} + +/// Response for the `StreamingPull` method. This response is used to stream +/// messages from the server to the client. +class StreamingPullResponse extends $pb.GeneratedMessage { + factory StreamingPullResponse({ + $core.Iterable? receivedMessages, + StreamingPullResponse_ModifyAckDeadlineConfirmation? + modifyAckDeadlineConfirmation, + StreamingPullResponse_SubscriptionProperties? subscriptionProperties, + StreamingPullResponse_AcknowledgeConfirmation? acknowledgeConfirmation, + }) { + final $result = create(); + if (receivedMessages != null) { + $result.receivedMessages.addAll(receivedMessages); + } + if (modifyAckDeadlineConfirmation != null) { + $result.modifyAckDeadlineConfirmation = modifyAckDeadlineConfirmation; + } + if (subscriptionProperties != null) { + $result.subscriptionProperties = subscriptionProperties; + } + if (acknowledgeConfirmation != null) { + $result.acknowledgeConfirmation = acknowledgeConfirmation; + } + return $result; + } + StreamingPullResponse._() : super(); + factory StreamingPullResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory StreamingPullResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'StreamingPullResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pc( + 1, _omitFieldNames ? '' : 'receivedMessages', $pb.PbFieldType.PM, + subBuilder: ReceivedMessage.create) + ..aOM( + 3, _omitFieldNames ? '' : 'modifyAckDeadlineConfirmation', + subBuilder: StreamingPullResponse_ModifyAckDeadlineConfirmation.create) + ..aOM( + 4, _omitFieldNames ? '' : 'subscriptionProperties', + subBuilder: StreamingPullResponse_SubscriptionProperties.create) + ..aOM( + 5, _omitFieldNames ? '' : 'acknowledgeConfirmation', + subBuilder: StreamingPullResponse_AcknowledgeConfirmation.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullResponse clone() => + StreamingPullResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StreamingPullResponse copyWith( + void Function(StreamingPullResponse) updates) => + super.copyWith((message) => updates(message as StreamingPullResponse)) + as StreamingPullResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static StreamingPullResponse create() => StreamingPullResponse._(); + StreamingPullResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static StreamingPullResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static StreamingPullResponse? _defaultInstance; + + /// Optional. Received Pub/Sub messages. + @$pb.TagNumber(1) + $pb.PbList get receivedMessages => $_getList(0); + + /// Optional. This field will only be set if `enable_exactly_once_delivery` is + /// set to `true` and is not guaranteed to be populated. + @$pb.TagNumber(3) + StreamingPullResponse_ModifyAckDeadlineConfirmation + get modifyAckDeadlineConfirmation => $_getN(1); + @$pb.TagNumber(3) + set modifyAckDeadlineConfirmation( + StreamingPullResponse_ModifyAckDeadlineConfirmation v) { + $_setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasModifyAckDeadlineConfirmation() => $_has(1); + @$pb.TagNumber(3) + void clearModifyAckDeadlineConfirmation() => $_clearField(3); + @$pb.TagNumber(3) + StreamingPullResponse_ModifyAckDeadlineConfirmation + ensureModifyAckDeadlineConfirmation() => $_ensure(1); + + /// Optional. Properties associated with this subscription. + @$pb.TagNumber(4) + StreamingPullResponse_SubscriptionProperties get subscriptionProperties => + $_getN(2); + @$pb.TagNumber(4) + set subscriptionProperties(StreamingPullResponse_SubscriptionProperties v) { + $_setField(4, v); + } + + @$pb.TagNumber(4) + $core.bool hasSubscriptionProperties() => $_has(2); + @$pb.TagNumber(4) + void clearSubscriptionProperties() => $_clearField(4); + @$pb.TagNumber(4) + StreamingPullResponse_SubscriptionProperties ensureSubscriptionProperties() => + $_ensure(2); + + /// Optional. This field will only be set if `enable_exactly_once_delivery` is + /// set to `true` and is not guaranteed to be populated. + @$pb.TagNumber(5) + StreamingPullResponse_AcknowledgeConfirmation get acknowledgeConfirmation => + $_getN(3); + @$pb.TagNumber(5) + set acknowledgeConfirmation(StreamingPullResponse_AcknowledgeConfirmation v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasAcknowledgeConfirmation() => $_has(3); + @$pb.TagNumber(5) + void clearAcknowledgeConfirmation() => $_clearField(5); + @$pb.TagNumber(5) + StreamingPullResponse_AcknowledgeConfirmation + ensureAcknowledgeConfirmation() => $_ensure(3); +} + +/// Request for the `CreateSnapshot` method. +class CreateSnapshotRequest extends $pb.GeneratedMessage { + factory CreateSnapshotRequest({ + $core.String? name, + $core.String? subscription, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? labels, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? tags, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (subscription != null) { + $result.subscription = subscription; + } + if (labels != null) { + $result.labels.addEntries(labels); + } + if (tags != null) { + $result.tags.addEntries(tags); + } + return $result; + } + CreateSnapshotRequest._() : super(); + factory CreateSnapshotRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory CreateSnapshotRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CreateSnapshotRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..aOS(2, _omitFieldNames ? '' : 'subscription') + ..m<$core.String, $core.String>(3, _omitFieldNames ? '' : 'labels', + entryClassName: 'CreateSnapshotRequest.LabelsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..m<$core.String, $core.String>(4, _omitFieldNames ? '' : 'tags', + entryClassName: 'CreateSnapshotRequest.TagsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CreateSnapshotRequest clone() => + CreateSnapshotRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CreateSnapshotRequest copyWith( + void Function(CreateSnapshotRequest) updates) => + super.copyWith((message) => updates(message as CreateSnapshotRequest)) + as CreateSnapshotRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateSnapshotRequest create() => CreateSnapshotRequest._(); + CreateSnapshotRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateSnapshotRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CreateSnapshotRequest? _defaultInstance; + + /// Required. User-provided name for this snapshot. If the name is not provided + /// in the request, the server will assign a random name for this snapshot on + /// the same project as the subscription. Note that for REST API requests, you + /// must specify a name. See the [resource name + /// rules](https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). + /// Format is `projects/{project}/snapshots/{snap}`. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// Required. The subscription whose backlog the snapshot retains. + /// Specifically, the created snapshot is guaranteed to retain: + /// (a) The existing backlog on the subscription. More precisely, this is + /// defined as the messages in the subscription's backlog that are + /// unacknowledged upon the successful completion of the + /// `CreateSnapshot` request; as well as: + /// (b) Any messages published to the subscription's topic following the + /// successful completion of the CreateSnapshot request. + /// Format is `projects/{project}/subscriptions/{sub}`. + @$pb.TagNumber(2) + $core.String get subscription => $_getSZ(1); + @$pb.TagNumber(2) + set subscription($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasSubscription() => $_has(1); + @$pb.TagNumber(2) + void clearSubscription() => $_clearField(2); + + /// Optional. See [Creating and managing + /// labels](https://cloud.google.com/pubsub/docs/labels). + @$pb.TagNumber(3) + $pb.PbMap<$core.String, $core.String> get labels => $_getMap(2); + + /// Optional. Input only. Immutable. Tag keys/values directly bound to this + /// resource. For example: + /// "123/environment": "production", + /// "123/costCenter": "marketing" + /// See https://docs.cloud.google.com/pubsub/docs/tags for more information on + /// using tags with Pub/Sub resources. + @$pb.TagNumber(4) + $pb.PbMap<$core.String, $core.String> get tags => $_getMap(3); +} + +/// Request for the UpdateSnapshot method. +class UpdateSnapshotRequest extends $pb.GeneratedMessage { + factory UpdateSnapshotRequest({ + Snapshot? snapshot, + $6.FieldMask? updateMask, + }) { + final $result = create(); + if (snapshot != null) { + $result.snapshot = snapshot; + } + if (updateMask != null) { + $result.updateMask = updateMask; + } + return $result; + } + UpdateSnapshotRequest._() : super(); + factory UpdateSnapshotRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory UpdateSnapshotRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'UpdateSnapshotRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'snapshot', + subBuilder: Snapshot.create) + ..aOM<$6.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', + subBuilder: $6.FieldMask.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + UpdateSnapshotRequest clone() => + UpdateSnapshotRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + UpdateSnapshotRequest copyWith( + void Function(UpdateSnapshotRequest) updates) => + super.copyWith((message) => updates(message as UpdateSnapshotRequest)) + as UpdateSnapshotRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static UpdateSnapshotRequest create() => UpdateSnapshotRequest._(); + UpdateSnapshotRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static UpdateSnapshotRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static UpdateSnapshotRequest? _defaultInstance; + + /// Required. The updated snapshot object. + @$pb.TagNumber(1) + Snapshot get snapshot => $_getN(0); + @$pb.TagNumber(1) + set snapshot(Snapshot v) { + $_setField(1, v); + } + + @$pb.TagNumber(1) + $core.bool hasSnapshot() => $_has(0); + @$pb.TagNumber(1) + void clearSnapshot() => $_clearField(1); + @$pb.TagNumber(1) + Snapshot ensureSnapshot() => $_ensure(0); + + /// Required. Indicates which fields in the provided snapshot to update. + /// Must be specified and non-empty. + @$pb.TagNumber(2) + $6.FieldMask get updateMask => $_getN(1); + @$pb.TagNumber(2) + set updateMask($6.FieldMask v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasUpdateMask() => $_has(1); + @$pb.TagNumber(2) + void clearUpdateMask() => $_clearField(2); + @$pb.TagNumber(2) + $6.FieldMask ensureUpdateMask() => $_ensure(1); +} + +/// A snapshot resource. Snapshots are used in +/// [Seek](https://cloud.google.com/pubsub/docs/replay-overview) +/// operations, which allow you to manage message acknowledgments in bulk. That +/// is, you can set the acknowledgment state of messages in an existing +/// subscription to the state captured by a snapshot. +class Snapshot extends $pb.GeneratedMessage { + factory Snapshot({ + $core.String? name, + $core.String? topic, + $3.Timestamp? expireTime, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? labels, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (topic != null) { + $result.topic = topic; + } + if (expireTime != null) { + $result.expireTime = expireTime; + } + if (labels != null) { + $result.labels.addEntries(labels); + } + return $result; + } + Snapshot._() : super(); + factory Snapshot.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Snapshot.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Snapshot', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..aOS(2, _omitFieldNames ? '' : 'topic') + ..aOM<$3.Timestamp>(3, _omitFieldNames ? '' : 'expireTime', + subBuilder: $3.Timestamp.create) + ..m<$core.String, $core.String>(4, _omitFieldNames ? '' : 'labels', + entryClassName: 'Snapshot.LabelsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('google.pubsub.v1')) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Snapshot clone() => Snapshot()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Snapshot copyWith(void Function(Snapshot) updates) => + super.copyWith((message) => updates(message as Snapshot)) as Snapshot; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Snapshot create() => Snapshot._(); + Snapshot createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Snapshot getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Snapshot? _defaultInstance; + + /// Optional. The name of the snapshot. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// Optional. The name of the topic from which this snapshot is retaining + /// messages. + @$pb.TagNumber(2) + $core.String get topic => $_getSZ(1); + @$pb.TagNumber(2) + set topic($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasTopic() => $_has(1); + @$pb.TagNumber(2) + void clearTopic() => $_clearField(2); + + /// Optional. The snapshot is guaranteed to exist up until this time. + /// A newly-created snapshot expires no later than 7 days from the time of its + /// creation. Its exact lifetime is determined at creation by the existing + /// backlog in the source subscription. Specifically, the lifetime of the + /// snapshot is `7 days - (age of oldest unacked message in the subscription)`. + /// For example, consider a subscription whose oldest unacked message is 3 days + /// old. If a snapshot is created from this subscription, the snapshot -- which + /// will always capture this 3-day-old backlog as long as the snapshot + /// exists -- will expire in 4 days. The service will refuse to create a + /// snapshot that would expire in less than 1 hour after creation. + @$pb.TagNumber(3) + $3.Timestamp get expireTime => $_getN(2); + @$pb.TagNumber(3) + set expireTime($3.Timestamp v) { + $_setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasExpireTime() => $_has(2); + @$pb.TagNumber(3) + void clearExpireTime() => $_clearField(3); + @$pb.TagNumber(3) + $3.Timestamp ensureExpireTime() => $_ensure(2); + + /// Optional. See [Creating and managing labels] + /// (https://cloud.google.com/pubsub/docs/labels). + @$pb.TagNumber(4) + $pb.PbMap<$core.String, $core.String> get labels => $_getMap(3); +} + +/// Request for the GetSnapshot method. +class GetSnapshotRequest extends $pb.GeneratedMessage { + factory GetSnapshotRequest({ + $core.String? snapshot, + }) { + final $result = create(); + if (snapshot != null) { + $result.snapshot = snapshot; + } + return $result; + } + GetSnapshotRequest._() : super(); + factory GetSnapshotRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory GetSnapshotRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'GetSnapshotRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'snapshot') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetSnapshotRequest clone() => GetSnapshotRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetSnapshotRequest copyWith(void Function(GetSnapshotRequest) updates) => + super.copyWith((message) => updates(message as GetSnapshotRequest)) + as GetSnapshotRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static GetSnapshotRequest create() => GetSnapshotRequest._(); + GetSnapshotRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GetSnapshotRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static GetSnapshotRequest? _defaultInstance; + + /// Required. The name of the snapshot to get. + /// Format is `projects/{project}/snapshots/{snap}`. + @$pb.TagNumber(1) + $core.String get snapshot => $_getSZ(0); + @$pb.TagNumber(1) + set snapshot($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSnapshot() => $_has(0); + @$pb.TagNumber(1) + void clearSnapshot() => $_clearField(1); +} + +/// Request for the `ListSnapshots` method. +class ListSnapshotsRequest extends $pb.GeneratedMessage { + factory ListSnapshotsRequest({ + $core.String? project, + $core.int? pageSize, + $core.String? pageToken, + }) { + final $result = create(); + if (project != null) { + $result.project = project; + } + if (pageSize != null) { + $result.pageSize = pageSize; + } + if (pageToken != null) { + $result.pageToken = pageToken; + } + return $result; + } + ListSnapshotsRequest._() : super(); + factory ListSnapshotsRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListSnapshotsRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListSnapshotsRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'project') + ..a<$core.int>(2, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.O3) + ..aOS(3, _omitFieldNames ? '' : 'pageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSnapshotsRequest clone() => + ListSnapshotsRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSnapshotsRequest copyWith(void Function(ListSnapshotsRequest) updates) => + super.copyWith((message) => updates(message as ListSnapshotsRequest)) + as ListSnapshotsRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSnapshotsRequest create() => ListSnapshotsRequest._(); + ListSnapshotsRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSnapshotsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListSnapshotsRequest? _defaultInstance; + + /// Required. The name of the project in which to list snapshots. + /// Format is `projects/{project-id}`. + @$pb.TagNumber(1) + $core.String get project => $_getSZ(0); + @$pb.TagNumber(1) + set project($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasProject() => $_has(0); + @$pb.TagNumber(1) + void clearProject() => $_clearField(1); + + /// Optional. Maximum number of snapshots to return. + @$pb.TagNumber(2) + $core.int get pageSize => $_getIZ(1); + @$pb.TagNumber(2) + set pageSize($core.int v) { + $_setSignedInt32(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasPageSize() => $_has(1); + @$pb.TagNumber(2) + void clearPageSize() => $_clearField(2); + + /// Optional. The value returned by the last `ListSnapshotsResponse`; indicates + /// that this is a continuation of a prior `ListSnapshots` call, and that the + /// system should return the next page of data. + @$pb.TagNumber(3) + $core.String get pageToken => $_getSZ(2); + @$pb.TagNumber(3) + set pageToken($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPageToken() => $_has(2); + @$pb.TagNumber(3) + void clearPageToken() => $_clearField(3); +} + +/// Response for the `ListSnapshots` method. +class ListSnapshotsResponse extends $pb.GeneratedMessage { + factory ListSnapshotsResponse({ + $core.Iterable? snapshots, + $core.String? nextPageToken, + }) { + final $result = create(); + if (snapshots != null) { + $result.snapshots.addAll(snapshots); + } + if (nextPageToken != null) { + $result.nextPageToken = nextPageToken; + } + return $result; + } + ListSnapshotsResponse._() : super(); + factory ListSnapshotsResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListSnapshotsResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListSnapshotsResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pc(1, _omitFieldNames ? '' : 'snapshots', $pb.PbFieldType.PM, + subBuilder: Snapshot.create) + ..aOS(2, _omitFieldNames ? '' : 'nextPageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSnapshotsResponse clone() => + ListSnapshotsResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSnapshotsResponse copyWith( + void Function(ListSnapshotsResponse) updates) => + super.copyWith((message) => updates(message as ListSnapshotsResponse)) + as ListSnapshotsResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSnapshotsResponse create() => ListSnapshotsResponse._(); + ListSnapshotsResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSnapshotsResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListSnapshotsResponse? _defaultInstance; + + /// Optional. The resulting snapshots. + @$pb.TagNumber(1) + $pb.PbList get snapshots => $_getList(0); + + /// Optional. If not empty, indicates that there may be more snapshot that + /// match the request; this value should be passed in a new + /// `ListSnapshotsRequest`. + @$pb.TagNumber(2) + $core.String get nextPageToken => $_getSZ(1); + @$pb.TagNumber(2) + set nextPageToken($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNextPageToken() => $_has(1); + @$pb.TagNumber(2) + void clearNextPageToken() => $_clearField(2); +} + +/// Request for the `DeleteSnapshot` method. +class DeleteSnapshotRequest extends $pb.GeneratedMessage { + factory DeleteSnapshotRequest({ + $core.String? snapshot, + }) { + final $result = create(); + if (snapshot != null) { + $result.snapshot = snapshot; + } + return $result; + } + DeleteSnapshotRequest._() : super(); + factory DeleteSnapshotRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DeleteSnapshotRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DeleteSnapshotRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'snapshot') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteSnapshotRequest clone() => + DeleteSnapshotRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteSnapshotRequest copyWith( + void Function(DeleteSnapshotRequest) updates) => + super.copyWith((message) => updates(message as DeleteSnapshotRequest)) + as DeleteSnapshotRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DeleteSnapshotRequest create() => DeleteSnapshotRequest._(); + DeleteSnapshotRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DeleteSnapshotRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DeleteSnapshotRequest? _defaultInstance; + + /// Required. The name of the snapshot to delete. + /// Format is `projects/{project}/snapshots/{snap}`. + @$pb.TagNumber(1) + $core.String get snapshot => $_getSZ(0); + @$pb.TagNumber(1) + set snapshot($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSnapshot() => $_has(0); + @$pb.TagNumber(1) + void clearSnapshot() => $_clearField(1); +} + +enum SeekRequest_Target { time, snapshot, notSet } + +/// Request for the `Seek` method. +class SeekRequest extends $pb.GeneratedMessage { + factory SeekRequest({ + $core.String? subscription, + $3.Timestamp? time, + $core.String? snapshot, + }) { + final $result = create(); + if (subscription != null) { + $result.subscription = subscription; + } + if (time != null) { + $result.time = time; + } + if (snapshot != null) { + $result.snapshot = snapshot; + } + return $result; + } + SeekRequest._() : super(); + factory SeekRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SeekRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, SeekRequest_Target> + _SeekRequest_TargetByTag = { + 2: SeekRequest_Target.time, + 3: SeekRequest_Target.snapshot, + 0: SeekRequest_Target.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SeekRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [2, 3]) + ..aOS(1, _omitFieldNames ? '' : 'subscription') + ..aOM<$3.Timestamp>(2, _omitFieldNames ? '' : 'time', + subBuilder: $3.Timestamp.create) + ..aOS(3, _omitFieldNames ? '' : 'snapshot') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SeekRequest clone() => SeekRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SeekRequest copyWith(void Function(SeekRequest) updates) => + super.copyWith((message) => updates(message as SeekRequest)) + as SeekRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SeekRequest create() => SeekRequest._(); + SeekRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SeekRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SeekRequest? _defaultInstance; + + SeekRequest_Target whichTarget() => + _SeekRequest_TargetByTag[$_whichOneof(0)]!; + void clearTarget() => $_clearField($_whichOneof(0)); + + /// Required. The subscription to affect. + @$pb.TagNumber(1) + $core.String get subscription => $_getSZ(0); + @$pb.TagNumber(1) + set subscription($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasSubscription() => $_has(0); + @$pb.TagNumber(1) + void clearSubscription() => $_clearField(1); + + /// Optional. The time to seek to. + /// Messages retained in the subscription that were published before this + /// time are marked as acknowledged, and messages retained in the + /// subscription that were published after this time are marked as + /// unacknowledged. Note that this operation affects only those messages + /// retained in the subscription (configured by the combination of + /// `message_retention_duration` and `retain_acked_messages`). For example, + /// if `time` corresponds to a point before the message retention + /// window (or to a point before the system's notion of the subscription + /// creation time), only retained messages will be marked as unacknowledged, + /// and already-expunged messages will not be restored. + @$pb.TagNumber(2) + $3.Timestamp get time => $_getN(1); + @$pb.TagNumber(2) + set time($3.Timestamp v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasTime() => $_has(1); + @$pb.TagNumber(2) + void clearTime() => $_clearField(2); + @$pb.TagNumber(2) + $3.Timestamp ensureTime() => $_ensure(1); + + /// Optional. The snapshot to seek to. The snapshot's topic must be the same + /// as that of the provided subscription. Format is + /// `projects/{project}/snapshots/{snap}`. + @$pb.TagNumber(3) + $core.String get snapshot => $_getSZ(2); + @$pb.TagNumber(3) + set snapshot($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasSnapshot() => $_has(2); + @$pb.TagNumber(3) + void clearSnapshot() => $_clearField(3); +} + +/// Response for the `Seek` method (this response is empty). +class SeekResponse extends $pb.GeneratedMessage { + factory SeekResponse() => create(); + SeekResponse._() : super(); + factory SeekResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SeekResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SeekResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SeekResponse clone() => SeekResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SeekResponse copyWith(void Function(SeekResponse) updates) => + super.copyWith((message) => updates(message as SeekResponse)) + as SeekResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SeekResponse create() => SeekResponse._(); + SeekResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SeekResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SeekResponse? _defaultInstance; +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbenum.dart new file mode 100644 index 00000000..12cba020 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbenum.dart @@ -0,0 +1,610 @@ +// +// Generated code. Do not modify. +// source: google/pubsub/v1/pubsub.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +/// Possible states for ingestion from Amazon Kinesis Data Streams. +class IngestionDataSourceSettings_AwsKinesis_State extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const IngestionDataSourceSettings_AwsKinesis_State STATE_UNSPECIFIED = + IngestionDataSourceSettings_AwsKinesis_State._( + 0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// Ingestion is active. + static const IngestionDataSourceSettings_AwsKinesis_State ACTIVE = + IngestionDataSourceSettings_AwsKinesis_State._( + 1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Permission denied encountered while consuming data from Kinesis. + /// This can happen if: + /// - The provided `aws_role_arn` does not exist or does not have the + /// appropriate permissions attached. + /// - The provided `aws_role_arn` is not set up properly for Identity + /// Federation using `gcp_service_account`. + /// - The Pub/Sub SA is not granted the + /// `iam.serviceAccounts.getOpenIdToken` permission on + /// `gcp_service_account`. + static const IngestionDataSourceSettings_AwsKinesis_State + KINESIS_PERMISSION_DENIED = + IngestionDataSourceSettings_AwsKinesis_State._( + 2, _omitEnumNames ? '' : 'KINESIS_PERMISSION_DENIED'); + + /// Permission denied encountered while publishing to the topic. This can + /// happen if the Pub/Sub SA has not been granted the [appropriate publish + /// permissions](https://cloud.google.com/pubsub/docs/access-control#pubsub.publisher) + static const IngestionDataSourceSettings_AwsKinesis_State + PUBLISH_PERMISSION_DENIED = + IngestionDataSourceSettings_AwsKinesis_State._( + 3, _omitEnumNames ? '' : 'PUBLISH_PERMISSION_DENIED'); + + /// The Kinesis stream does not exist. + static const IngestionDataSourceSettings_AwsKinesis_State STREAM_NOT_FOUND = + IngestionDataSourceSettings_AwsKinesis_State._( + 4, _omitEnumNames ? '' : 'STREAM_NOT_FOUND'); + + /// The Kinesis consumer does not exist. + static const IngestionDataSourceSettings_AwsKinesis_State CONSUMER_NOT_FOUND = + IngestionDataSourceSettings_AwsKinesis_State._( + 5, _omitEnumNames ? '' : 'CONSUMER_NOT_FOUND'); + + static const $core.List values = + [ + STATE_UNSPECIFIED, + ACTIVE, + KINESIS_PERMISSION_DENIED, + PUBLISH_PERMISSION_DENIED, + STREAM_NOT_FOUND, + CONSUMER_NOT_FOUND, + ]; + + static final $core.List + _byValue = $pb.ProtobufEnum.$_initByValueList(values, 5); + static IngestionDataSourceSettings_AwsKinesis_State? valueOf( + $core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const IngestionDataSourceSettings_AwsKinesis_State._(super.v, super.n); +} + +/// Possible states for ingestion from Cloud Storage. +class IngestionDataSourceSettings_CloudStorage_State extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const IngestionDataSourceSettings_CloudStorage_State + STATE_UNSPECIFIED = IngestionDataSourceSettings_CloudStorage_State._( + 0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// Ingestion is active. + static const IngestionDataSourceSettings_CloudStorage_State ACTIVE = + IngestionDataSourceSettings_CloudStorage_State._( + 1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Permission denied encountered while calling the Cloud Storage API. This + /// can happen if the Pub/Sub SA has not been granted the + /// [appropriate + /// permissions](https://cloud.google.com/storage/docs/access-control/iam-permissions): + /// - storage.objects.list: to list the objects in a bucket. + /// - storage.objects.get: to read the objects in a bucket. + /// - storage.buckets.get: to verify the bucket exists. + static const IngestionDataSourceSettings_CloudStorage_State + CLOUD_STORAGE_PERMISSION_DENIED = + IngestionDataSourceSettings_CloudStorage_State._( + 2, _omitEnumNames ? '' : 'CLOUD_STORAGE_PERMISSION_DENIED'); + + /// Permission denied encountered while publishing to the topic. This can + /// happen if the Pub/Sub SA has not been granted the [appropriate publish + /// permissions](https://cloud.google.com/pubsub/docs/access-control#pubsub.publisher) + static const IngestionDataSourceSettings_CloudStorage_State + PUBLISH_PERMISSION_DENIED = + IngestionDataSourceSettings_CloudStorage_State._( + 3, _omitEnumNames ? '' : 'PUBLISH_PERMISSION_DENIED'); + + /// The provided Cloud Storage bucket doesn't exist. + static const IngestionDataSourceSettings_CloudStorage_State BUCKET_NOT_FOUND = + IngestionDataSourceSettings_CloudStorage_State._( + 4, _omitEnumNames ? '' : 'BUCKET_NOT_FOUND'); + + /// The Cloud Storage bucket has too many objects, ingestion will be + /// paused. + static const IngestionDataSourceSettings_CloudStorage_State TOO_MANY_OBJECTS = + IngestionDataSourceSettings_CloudStorage_State._( + 5, _omitEnumNames ? '' : 'TOO_MANY_OBJECTS'); + + static const $core.List + values = [ + STATE_UNSPECIFIED, + ACTIVE, + CLOUD_STORAGE_PERMISSION_DENIED, + PUBLISH_PERMISSION_DENIED, + BUCKET_NOT_FOUND, + TOO_MANY_OBJECTS, + ]; + + static final $core.List + _byValue = $pb.ProtobufEnum.$_initByValueList(values, 5); + static IngestionDataSourceSettings_CloudStorage_State? valueOf( + $core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const IngestionDataSourceSettings_CloudStorage_State._(super.v, super.n); +} + +/// Possible states for managed ingestion from Event Hubs. +class IngestionDataSourceSettings_AzureEventHubs_State + extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const IngestionDataSourceSettings_AzureEventHubs_State + STATE_UNSPECIFIED = IngestionDataSourceSettings_AzureEventHubs_State._( + 0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// Ingestion is active. + static const IngestionDataSourceSettings_AzureEventHubs_State ACTIVE = + IngestionDataSourceSettings_AzureEventHubs_State._( + 1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Permission denied encountered while consuming data from Event Hubs. + /// This can happen when `client_id`, or `tenant_id` are invalid. Or the + /// right permissions haven't been granted. + static const IngestionDataSourceSettings_AzureEventHubs_State + EVENT_HUBS_PERMISSION_DENIED = + IngestionDataSourceSettings_AzureEventHubs_State._( + 2, _omitEnumNames ? '' : 'EVENT_HUBS_PERMISSION_DENIED'); + + /// Permission denied encountered while publishing to the topic. + static const IngestionDataSourceSettings_AzureEventHubs_State + PUBLISH_PERMISSION_DENIED = + IngestionDataSourceSettings_AzureEventHubs_State._( + 3, _omitEnumNames ? '' : 'PUBLISH_PERMISSION_DENIED'); + + /// The provided Event Hubs namespace couldn't be found. + static const IngestionDataSourceSettings_AzureEventHubs_State + NAMESPACE_NOT_FOUND = IngestionDataSourceSettings_AzureEventHubs_State._( + 4, _omitEnumNames ? '' : 'NAMESPACE_NOT_FOUND'); + + /// The provided Event Hub couldn't be found. + static const IngestionDataSourceSettings_AzureEventHubs_State + EVENT_HUB_NOT_FOUND = IngestionDataSourceSettings_AzureEventHubs_State._( + 5, _omitEnumNames ? '' : 'EVENT_HUB_NOT_FOUND'); + + /// The provided Event Hubs subscription couldn't be found. + static const IngestionDataSourceSettings_AzureEventHubs_State + SUBSCRIPTION_NOT_FOUND = + IngestionDataSourceSettings_AzureEventHubs_State._( + 6, _omitEnumNames ? '' : 'SUBSCRIPTION_NOT_FOUND'); + + /// The provided Event Hubs resource group couldn't be found. + static const IngestionDataSourceSettings_AzureEventHubs_State + RESOURCE_GROUP_NOT_FOUND = + IngestionDataSourceSettings_AzureEventHubs_State._( + 7, _omitEnumNames ? '' : 'RESOURCE_GROUP_NOT_FOUND'); + + static const $core.List + values = [ + STATE_UNSPECIFIED, + ACTIVE, + EVENT_HUBS_PERMISSION_DENIED, + PUBLISH_PERMISSION_DENIED, + NAMESPACE_NOT_FOUND, + EVENT_HUB_NOT_FOUND, + SUBSCRIPTION_NOT_FOUND, + RESOURCE_GROUP_NOT_FOUND, + ]; + + static final $core.List + _byValue = $pb.ProtobufEnum.$_initByValueList(values, 7); + static IngestionDataSourceSettings_AzureEventHubs_State? valueOf( + $core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const IngestionDataSourceSettings_AzureEventHubs_State._(super.v, super.n); +} + +/// Possible states for managed ingestion from Amazon MSK. +class IngestionDataSourceSettings_AwsMsk_State extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const IngestionDataSourceSettings_AwsMsk_State STATE_UNSPECIFIED = + IngestionDataSourceSettings_AwsMsk_State._( + 0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// Ingestion is active. + static const IngestionDataSourceSettings_AwsMsk_State ACTIVE = + IngestionDataSourceSettings_AwsMsk_State._( + 1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Permission denied encountered while consuming data from Amazon MSK. + static const IngestionDataSourceSettings_AwsMsk_State MSK_PERMISSION_DENIED = + IngestionDataSourceSettings_AwsMsk_State._( + 2, _omitEnumNames ? '' : 'MSK_PERMISSION_DENIED'); + + /// Permission denied encountered while publishing to the topic. + static const IngestionDataSourceSettings_AwsMsk_State + PUBLISH_PERMISSION_DENIED = IngestionDataSourceSettings_AwsMsk_State._( + 3, _omitEnumNames ? '' : 'PUBLISH_PERMISSION_DENIED'); + + /// The provided MSK cluster wasn't found. + static const IngestionDataSourceSettings_AwsMsk_State CLUSTER_NOT_FOUND = + IngestionDataSourceSettings_AwsMsk_State._( + 4, _omitEnumNames ? '' : 'CLUSTER_NOT_FOUND'); + + /// The provided topic wasn't found. + static const IngestionDataSourceSettings_AwsMsk_State TOPIC_NOT_FOUND = + IngestionDataSourceSettings_AwsMsk_State._( + 5, _omitEnumNames ? '' : 'TOPIC_NOT_FOUND'); + + static const $core.List values = + [ + STATE_UNSPECIFIED, + ACTIVE, + MSK_PERMISSION_DENIED, + PUBLISH_PERMISSION_DENIED, + CLUSTER_NOT_FOUND, + TOPIC_NOT_FOUND, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 5); + static IngestionDataSourceSettings_AwsMsk_State? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const IngestionDataSourceSettings_AwsMsk_State._(super.v, super.n); +} + +/// Possible states for managed ingestion from Confluent Cloud. +class IngestionDataSourceSettings_ConfluentCloud_State + extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const IngestionDataSourceSettings_ConfluentCloud_State + STATE_UNSPECIFIED = IngestionDataSourceSettings_ConfluentCloud_State._( + 0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// Ingestion is active. + static const IngestionDataSourceSettings_ConfluentCloud_State ACTIVE = + IngestionDataSourceSettings_ConfluentCloud_State._( + 1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Permission denied encountered while consuming data from Confluent + /// Cloud. + static const IngestionDataSourceSettings_ConfluentCloud_State + CONFLUENT_CLOUD_PERMISSION_DENIED = + IngestionDataSourceSettings_ConfluentCloud_State._( + 2, _omitEnumNames ? '' : 'CONFLUENT_CLOUD_PERMISSION_DENIED'); + + /// Permission denied encountered while publishing to the topic. + static const IngestionDataSourceSettings_ConfluentCloud_State + PUBLISH_PERMISSION_DENIED = + IngestionDataSourceSettings_ConfluentCloud_State._( + 3, _omitEnumNames ? '' : 'PUBLISH_PERMISSION_DENIED'); + + /// The provided bootstrap server address is unreachable. + static const IngestionDataSourceSettings_ConfluentCloud_State + UNREACHABLE_BOOTSTRAP_SERVER = + IngestionDataSourceSettings_ConfluentCloud_State._( + 4, _omitEnumNames ? '' : 'UNREACHABLE_BOOTSTRAP_SERVER'); + + /// The provided cluster wasn't found. + static const IngestionDataSourceSettings_ConfluentCloud_State + CLUSTER_NOT_FOUND = IngestionDataSourceSettings_ConfluentCloud_State._( + 5, _omitEnumNames ? '' : 'CLUSTER_NOT_FOUND'); + + /// The provided topic wasn't found. + static const IngestionDataSourceSettings_ConfluentCloud_State + TOPIC_NOT_FOUND = IngestionDataSourceSettings_ConfluentCloud_State._( + 6, _omitEnumNames ? '' : 'TOPIC_NOT_FOUND'); + + static const $core.List + values = [ + STATE_UNSPECIFIED, + ACTIVE, + CONFLUENT_CLOUD_PERMISSION_DENIED, + PUBLISH_PERMISSION_DENIED, + UNREACHABLE_BOOTSTRAP_SERVER, + CLUSTER_NOT_FOUND, + TOPIC_NOT_FOUND, + ]; + + static final $core.List + _byValue = $pb.ProtobufEnum.$_initByValueList(values, 6); + static IngestionDataSourceSettings_ConfluentCloud_State? valueOf( + $core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const IngestionDataSourceSettings_ConfluentCloud_State._(super.v, super.n); +} + +/// Severity levels of Platform Logs. +class PlatformLogsSettings_Severity extends $pb.ProtobufEnum { + /// Default value. Logs level is unspecified. Logs will be disabled. + static const PlatformLogsSettings_Severity SEVERITY_UNSPECIFIED = + PlatformLogsSettings_Severity._( + 0, _omitEnumNames ? '' : 'SEVERITY_UNSPECIFIED'); + + /// Logs will be disabled. + static const PlatformLogsSettings_Severity DISABLED = + PlatformLogsSettings_Severity._(1, _omitEnumNames ? '' : 'DISABLED'); + + /// Debug logs and higher-severity logs will be written. + static const PlatformLogsSettings_Severity DEBUG = + PlatformLogsSettings_Severity._(2, _omitEnumNames ? '' : 'DEBUG'); + + /// Info logs and higher-severity logs will be written. + static const PlatformLogsSettings_Severity INFO = + PlatformLogsSettings_Severity._(3, _omitEnumNames ? '' : 'INFO'); + + /// Warning logs and higher-severity logs will be written. + static const PlatformLogsSettings_Severity WARNING = + PlatformLogsSettings_Severity._(4, _omitEnumNames ? '' : 'WARNING'); + + /// Only error logs will be written. + static const PlatformLogsSettings_Severity ERROR = + PlatformLogsSettings_Severity._(5, _omitEnumNames ? '' : 'ERROR'); + + static const $core.List values = + [ + SEVERITY_UNSPECIFIED, + DISABLED, + DEBUG, + INFO, + WARNING, + ERROR, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 5); + static PlatformLogsSettings_Severity? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const PlatformLogsSettings_Severity._(super.v, super.n); +} + +/// The state of the topic. +class Topic_State extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const Topic_State STATE_UNSPECIFIED = + Topic_State._(0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// The topic does not have any persistent errors. + static const Topic_State ACTIVE = + Topic_State._(1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Ingestion from the data source has encountered a permanent error. + /// See the more detailed error state in the corresponding ingestion + /// source configuration. + static const Topic_State INGESTION_RESOURCE_ERROR = + Topic_State._(2, _omitEnumNames ? '' : 'INGESTION_RESOURCE_ERROR'); + + static const $core.List values = [ + STATE_UNSPECIFIED, + ACTIVE, + INGESTION_RESOURCE_ERROR, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 2); + static Topic_State? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const Topic_State._(super.v, super.n); +} + +/// Possible states for a subscription. +class Subscription_State extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const Subscription_State STATE_UNSPECIFIED = + Subscription_State._(0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// The subscription can actively receive messages + static const Subscription_State ACTIVE = + Subscription_State._(1, _omitEnumNames ? '' : 'ACTIVE'); + + /// The subscription cannot receive messages because of an error with the + /// resource to which it pushes messages. See the more detailed error state + /// in the corresponding configuration. + static const Subscription_State RESOURCE_ERROR = + Subscription_State._(2, _omitEnumNames ? '' : 'RESOURCE_ERROR'); + + static const $core.List values = [ + STATE_UNSPECIFIED, + ACTIVE, + RESOURCE_ERROR, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 2); + static Subscription_State? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const Subscription_State._(super.v, super.n); +} + +/// Possible states for a BigQuery subscription. +class BigQueryConfig_State extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const BigQueryConfig_State STATE_UNSPECIFIED = + BigQueryConfig_State._(0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// The subscription can actively send messages to BigQuery + static const BigQueryConfig_State ACTIVE = + BigQueryConfig_State._(1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Cannot write to the BigQuery table because of permission denied errors. + /// This can happen if + /// - Pub/Sub SA has not been granted the [appropriate BigQuery IAM + /// permissions](https://cloud.google.com/pubsub/docs/create-subscription#assign_bigquery_service_account) + /// - bigquery.googleapis.com API is not enabled for the project + /// ([instructions](https://cloud.google.com/service-usage/docs/enable-disable)) + static const BigQueryConfig_State PERMISSION_DENIED = + BigQueryConfig_State._(2, _omitEnumNames ? '' : 'PERMISSION_DENIED'); + + /// Cannot write to the BigQuery table because it does not exist. + static const BigQueryConfig_State NOT_FOUND = + BigQueryConfig_State._(3, _omitEnumNames ? '' : 'NOT_FOUND'); + + /// Cannot write to the BigQuery table due to a schema mismatch. + static const BigQueryConfig_State SCHEMA_MISMATCH = + BigQueryConfig_State._(4, _omitEnumNames ? '' : 'SCHEMA_MISMATCH'); + + /// Cannot write to the destination because enforce_in_transit is set to true + /// and the destination locations are not in the allowed regions. + static const BigQueryConfig_State IN_TRANSIT_LOCATION_RESTRICTION = + BigQueryConfig_State._( + 5, _omitEnumNames ? '' : 'IN_TRANSIT_LOCATION_RESTRICTION'); + + /// Cannot write to the BigQuery table because the table is not in the same + /// location as where Vertex AI models used in `message_transform`s are + /// deployed. + static const BigQueryConfig_State VERTEX_AI_LOCATION_RESTRICTION = + BigQueryConfig_State._( + 6, _omitEnumNames ? '' : 'VERTEX_AI_LOCATION_RESTRICTION'); + + static const $core.List values = [ + STATE_UNSPECIFIED, + ACTIVE, + PERMISSION_DENIED, + NOT_FOUND, + SCHEMA_MISMATCH, + IN_TRANSIT_LOCATION_RESTRICTION, + VERTEX_AI_LOCATION_RESTRICTION, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 6); + static BigQueryConfig_State? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const BigQueryConfig_State._(super.v, super.n); +} + +/// Possible states for a Bigtable subscription. +/// Note: more states could be added in the future. Please code accordingly. +class BigtableConfig_State extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const BigtableConfig_State STATE_UNSPECIFIED = + BigtableConfig_State._(0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// The subscription can actively send messages to Bigtable. + static const BigtableConfig_State ACTIVE = + BigtableConfig_State._(1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Cannot write to Bigtable because the instance, table, or app profile + /// does not exist. + static const BigtableConfig_State NOT_FOUND = + BigtableConfig_State._(2, _omitEnumNames ? '' : 'NOT_FOUND'); + + /// Cannot write to Bigtable because the app profile is not configured for + /// single-cluster routing. + static const BigtableConfig_State APP_PROFILE_MISCONFIGURED = + BigtableConfig_State._( + 3, _omitEnumNames ? '' : 'APP_PROFILE_MISCONFIGURED'); + + /// Cannot write to Bigtable because of permission denied errors. + /// This can happen if: + /// - The Pub/Sub service agent has not been granted the + /// [appropriate Bigtable IAM permission + /// bigtable.tables.mutateRows]({$universe.dns_names.final_documentation_domain}/bigtable/docs/access-control#permissions) + /// - The bigtable.googleapis.com API is not enabled for the project + /// ([instructions]({$universe.dns_names.final_documentation_domain}/service-usage/docs/enable-disable)) + static const BigtableConfig_State PERMISSION_DENIED = + BigtableConfig_State._(4, _omitEnumNames ? '' : 'PERMISSION_DENIED'); + + /// Cannot write to Bigtable because of a missing column family ("data") or + /// if there is no structured row key for the subscription name + message ID. + static const BigtableConfig_State SCHEMA_MISMATCH = + BigtableConfig_State._(5, _omitEnumNames ? '' : 'SCHEMA_MISMATCH'); + + /// Cannot write to the destination because enforce_in_transit is set to true + /// and the destination locations are not in the allowed regions. + static const BigtableConfig_State IN_TRANSIT_LOCATION_RESTRICTION = + BigtableConfig_State._( + 6, _omitEnumNames ? '' : 'IN_TRANSIT_LOCATION_RESTRICTION'); + + /// Cannot write to Bigtable because the table is not in the same location as + /// where Vertex AI models used in `message_transform`s are deployed. + static const BigtableConfig_State VERTEX_AI_LOCATION_RESTRICTION = + BigtableConfig_State._( + 7, _omitEnumNames ? '' : 'VERTEX_AI_LOCATION_RESTRICTION'); + + static const $core.List values = [ + STATE_UNSPECIFIED, + ACTIVE, + NOT_FOUND, + APP_PROFILE_MISCONFIGURED, + PERMISSION_DENIED, + SCHEMA_MISMATCH, + IN_TRANSIT_LOCATION_RESTRICTION, + VERTEX_AI_LOCATION_RESTRICTION, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 7); + static BigtableConfig_State? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const BigtableConfig_State._(super.v, super.n); +} + +/// Possible states for a Cloud Storage subscription. +class CloudStorageConfig_State extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const CloudStorageConfig_State STATE_UNSPECIFIED = + CloudStorageConfig_State._(0, _omitEnumNames ? '' : 'STATE_UNSPECIFIED'); + + /// The subscription can actively send messages to Cloud Storage. + static const CloudStorageConfig_State ACTIVE = + CloudStorageConfig_State._(1, _omitEnumNames ? '' : 'ACTIVE'); + + /// Cannot write to the Cloud Storage bucket because of permission denied + /// errors. + static const CloudStorageConfig_State PERMISSION_DENIED = + CloudStorageConfig_State._(2, _omitEnumNames ? '' : 'PERMISSION_DENIED'); + + /// Cannot write to the Cloud Storage bucket because it does not exist. + static const CloudStorageConfig_State NOT_FOUND = + CloudStorageConfig_State._(3, _omitEnumNames ? '' : 'NOT_FOUND'); + + /// Cannot write to the destination because enforce_in_transit is set to true + /// and the destination locations are not in the allowed regions. + static const CloudStorageConfig_State IN_TRANSIT_LOCATION_RESTRICTION = + CloudStorageConfig_State._( + 4, _omitEnumNames ? '' : 'IN_TRANSIT_LOCATION_RESTRICTION'); + + /// Cannot write to the Cloud Storage bucket due to an incompatibility + /// between the topic schema and subscription settings. + static const CloudStorageConfig_State SCHEMA_MISMATCH = + CloudStorageConfig_State._(5, _omitEnumNames ? '' : 'SCHEMA_MISMATCH'); + + /// Cannot write to the Cloud Storage bucket because the bucket is not in the + /// same location as where Vertex AI models used in `message_transform`s are + /// deployed. + static const CloudStorageConfig_State VERTEX_AI_LOCATION_RESTRICTION = + CloudStorageConfig_State._( + 6, _omitEnumNames ? '' : 'VERTEX_AI_LOCATION_RESTRICTION'); + + static const $core.List values = + [ + STATE_UNSPECIFIED, + ACTIVE, + PERMISSION_DENIED, + NOT_FOUND, + IN_TRANSIT_LOCATION_RESTRICTION, + SCHEMA_MISMATCH, + VERTEX_AI_LOCATION_RESTRICTION, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 6); + static CloudStorageConfig_State? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const CloudStorageConfig_State._(super.v, super.n); +} + +const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart new file mode 100644 index 00000000..f7c2b106 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart @@ -0,0 +1,837 @@ +// +// Generated code. Do not modify. +// source: google/pubsub/v1/pubsub.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:async' as $async; +import 'dart:core' as $core; + +import 'package:grpc/service_api.dart' as $grpc; +import 'package:protobuf/protobuf.dart' as $pb; + +import '../../protobuf/empty.pb.dart' as $1; +import 'pubsub.pb.dart' as $0; + +export 'pubsub.pb.dart'; + +/// The service that an application uses to manipulate topics, and to send +/// messages to a topic. +@$pb.GrpcServiceName('google.pubsub.v1.Publisher') +class PublisherClient extends $grpc.Client { + /// The hostname for this service. + static const $core.String defaultHost = 'pubsub.googleapis.com'; + + /// OAuth scopes needed for the client. + static const $core.List<$core.String> oauthScopes = [ + 'https://www.googleapis.com/auth/cloud-platform', + 'https://www.googleapis.com/auth/pubsub', + ]; + + static final _$createTopic = $grpc.ClientMethod<$0.Topic, $0.Topic>( + '/google.pubsub.v1.Publisher/CreateTopic', + ($0.Topic value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Topic.fromBuffer(value)); + static final _$updateTopic = + $grpc.ClientMethod<$0.UpdateTopicRequest, $0.Topic>( + '/google.pubsub.v1.Publisher/UpdateTopic', + ($0.UpdateTopicRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Topic.fromBuffer(value)); + static final _$publish = + $grpc.ClientMethod<$0.PublishRequest, $0.PublishResponse>( + '/google.pubsub.v1.Publisher/Publish', + ($0.PublishRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.PublishResponse.fromBuffer(value)); + static final _$getTopic = $grpc.ClientMethod<$0.GetTopicRequest, $0.Topic>( + '/google.pubsub.v1.Publisher/GetTopic', + ($0.GetTopicRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Topic.fromBuffer(value)); + static final _$listTopics = + $grpc.ClientMethod<$0.ListTopicsRequest, $0.ListTopicsResponse>( + '/google.pubsub.v1.Publisher/ListTopics', + ($0.ListTopicsRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.ListTopicsResponse.fromBuffer(value)); + static final _$listTopicSubscriptions = $grpc.ClientMethod< + $0.ListTopicSubscriptionsRequest, $0.ListTopicSubscriptionsResponse>( + '/google.pubsub.v1.Publisher/ListTopicSubscriptions', + ($0.ListTopicSubscriptionsRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.ListTopicSubscriptionsResponse.fromBuffer(value)); + static final _$listTopicSnapshots = $grpc.ClientMethod< + $0.ListTopicSnapshotsRequest, $0.ListTopicSnapshotsResponse>( + '/google.pubsub.v1.Publisher/ListTopicSnapshots', + ($0.ListTopicSnapshotsRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.ListTopicSnapshotsResponse.fromBuffer(value)); + static final _$deleteTopic = + $grpc.ClientMethod<$0.DeleteTopicRequest, $1.Empty>( + '/google.pubsub.v1.Publisher/DeleteTopic', + ($0.DeleteTopicRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); + static final _$detachSubscription = $grpc.ClientMethod< + $0.DetachSubscriptionRequest, $0.DetachSubscriptionResponse>( + '/google.pubsub.v1.Publisher/DetachSubscription', + ($0.DetachSubscriptionRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.DetachSubscriptionResponse.fromBuffer(value)); + + PublisherClient(super.channel, {super.options, super.interceptors}); + + /// Creates the given topic with the given name. See the [resource name rules] + /// (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). + $grpc.ResponseFuture<$0.Topic> createTopic($0.Topic request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$createTopic, request, options: options); + } + + /// Updates an existing topic by updating the fields specified in the update + /// mask. Note that certain properties of a topic are not modifiable. + $grpc.ResponseFuture<$0.Topic> updateTopic($0.UpdateTopicRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$updateTopic, request, options: options); + } + + /// Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic + /// does not exist. + $grpc.ResponseFuture<$0.PublishResponse> publish($0.PublishRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$publish, request, options: options); + } + + /// Gets the configuration of a topic. + $grpc.ResponseFuture<$0.Topic> getTopic($0.GetTopicRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$getTopic, request, options: options); + } + + /// Lists matching topics. + $grpc.ResponseFuture<$0.ListTopicsResponse> listTopics( + $0.ListTopicsRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$listTopics, request, options: options); + } + + /// Lists the names of the attached subscriptions on this topic. + $grpc.ResponseFuture<$0.ListTopicSubscriptionsResponse> + listTopicSubscriptions($0.ListTopicSubscriptionsRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$listTopicSubscriptions, request, + options: options); + } + + /// Lists the names of the snapshots on this topic. Snapshots are used in + /// [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, + /// which allow you to manage message acknowledgments in bulk. That is, you can + /// set the acknowledgment state of messages in an existing subscription to the + /// state captured by a snapshot. + $grpc.ResponseFuture<$0.ListTopicSnapshotsResponse> listTopicSnapshots( + $0.ListTopicSnapshotsRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$listTopicSnapshots, request, options: options); + } + + /// Deletes the topic with the given name. Returns `NOT_FOUND` if the topic + /// does not exist. After a topic is deleted, a new topic may be created with + /// the same name; this is an entirely new topic with none of the old + /// configuration or subscriptions. Existing subscriptions to this topic are + /// not deleted, but their `topic` field is set to `_deleted-topic_`. + $grpc.ResponseFuture<$1.Empty> deleteTopic($0.DeleteTopicRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$deleteTopic, request, options: options); + } + + /// Detaches a subscription from this topic. All messages retained in the + /// subscription are dropped. Subsequent `Pull` and `StreamingPull` requests + /// will return FAILED_PRECONDITION. If the subscription is a push + /// subscription, pushes to the endpoint will stop. + $grpc.ResponseFuture<$0.DetachSubscriptionResponse> detachSubscription( + $0.DetachSubscriptionRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$detachSubscription, request, options: options); + } +} + +@$pb.GrpcServiceName('google.pubsub.v1.Publisher') +abstract class PublisherServiceBase extends $grpc.Service { + $core.String get $name => 'google.pubsub.v1.Publisher'; + + PublisherServiceBase() { + $addMethod($grpc.ServiceMethod<$0.Topic, $0.Topic>( + 'CreateTopic', + createTopic_Pre, + false, + false, + ($core.List<$core.int> value) => $0.Topic.fromBuffer(value), + ($0.Topic value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.UpdateTopicRequest, $0.Topic>( + 'UpdateTopic', + updateTopic_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.UpdateTopicRequest.fromBuffer(value), + ($0.Topic value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PublishRequest, $0.PublishResponse>( + 'Publish', + publish_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PublishRequest.fromBuffer(value), + ($0.PublishResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.GetTopicRequest, $0.Topic>( + 'GetTopic', + getTopic_Pre, + false, + false, + ($core.List<$core.int> value) => $0.GetTopicRequest.fromBuffer(value), + ($0.Topic value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.ListTopicsRequest, $0.ListTopicsResponse>( + 'ListTopics', + listTopics_Pre, + false, + false, + ($core.List<$core.int> value) => $0.ListTopicsRequest.fromBuffer(value), + ($0.ListTopicsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.ListTopicSubscriptionsRequest, + $0.ListTopicSubscriptionsResponse>( + 'ListTopicSubscriptions', + listTopicSubscriptions_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.ListTopicSubscriptionsRequest.fromBuffer(value), + ($0.ListTopicSubscriptionsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.ListTopicSnapshotsRequest, + $0.ListTopicSnapshotsResponse>( + 'ListTopicSnapshots', + listTopicSnapshots_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.ListTopicSnapshotsRequest.fromBuffer(value), + ($0.ListTopicSnapshotsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.DeleteTopicRequest, $1.Empty>( + 'DeleteTopic', + deleteTopic_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.DeleteTopicRequest.fromBuffer(value), + ($1.Empty value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.DetachSubscriptionRequest, + $0.DetachSubscriptionResponse>( + 'DetachSubscription', + detachSubscription_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.DetachSubscriptionRequest.fromBuffer(value), + ($0.DetachSubscriptionResponse value) => value.writeToBuffer())); + } + + $async.Future<$0.Topic> createTopic_Pre( + $grpc.ServiceCall $call, $async.Future<$0.Topic> $request) async { + return createTopic($call, await $request); + } + + $async.Future<$0.Topic> updateTopic_Pre($grpc.ServiceCall $call, + $async.Future<$0.UpdateTopicRequest> $request) async { + return updateTopic($call, await $request); + } + + $async.Future<$0.PublishResponse> publish_Pre($grpc.ServiceCall $call, + $async.Future<$0.PublishRequest> $request) async { + return publish($call, await $request); + } + + $async.Future<$0.Topic> getTopic_Pre($grpc.ServiceCall $call, + $async.Future<$0.GetTopicRequest> $request) async { + return getTopic($call, await $request); + } + + $async.Future<$0.ListTopicsResponse> listTopics_Pre($grpc.ServiceCall $call, + $async.Future<$0.ListTopicsRequest> $request) async { + return listTopics($call, await $request); + } + + $async.Future<$0.ListTopicSubscriptionsResponse> listTopicSubscriptions_Pre( + $grpc.ServiceCall $call, + $async.Future<$0.ListTopicSubscriptionsRequest> $request) async { + return listTopicSubscriptions($call, await $request); + } + + $async.Future<$0.ListTopicSnapshotsResponse> listTopicSnapshots_Pre( + $grpc.ServiceCall $call, + $async.Future<$0.ListTopicSnapshotsRequest> $request) async { + return listTopicSnapshots($call, await $request); + } + + $async.Future<$1.Empty> deleteTopic_Pre($grpc.ServiceCall $call, + $async.Future<$0.DeleteTopicRequest> $request) async { + return deleteTopic($call, await $request); + } + + $async.Future<$0.DetachSubscriptionResponse> detachSubscription_Pre( + $grpc.ServiceCall $call, + $async.Future<$0.DetachSubscriptionRequest> $request) async { + return detachSubscription($call, await $request); + } + + $async.Future<$0.Topic> createTopic($grpc.ServiceCall call, $0.Topic request); + $async.Future<$0.Topic> updateTopic( + $grpc.ServiceCall call, $0.UpdateTopicRequest request); + $async.Future<$0.PublishResponse> publish( + $grpc.ServiceCall call, $0.PublishRequest request); + $async.Future<$0.Topic> getTopic( + $grpc.ServiceCall call, $0.GetTopicRequest request); + $async.Future<$0.ListTopicsResponse> listTopics( + $grpc.ServiceCall call, $0.ListTopicsRequest request); + $async.Future<$0.ListTopicSubscriptionsResponse> listTopicSubscriptions( + $grpc.ServiceCall call, $0.ListTopicSubscriptionsRequest request); + $async.Future<$0.ListTopicSnapshotsResponse> listTopicSnapshots( + $grpc.ServiceCall call, $0.ListTopicSnapshotsRequest request); + $async.Future<$1.Empty> deleteTopic( + $grpc.ServiceCall call, $0.DeleteTopicRequest request); + $async.Future<$0.DetachSubscriptionResponse> detachSubscription( + $grpc.ServiceCall call, $0.DetachSubscriptionRequest request); +} + +/// The service that an application uses to manipulate subscriptions and to +/// consume messages from a subscription via the `Pull` method or by +/// establishing a bi-directional stream using the `StreamingPull` method. +@$pb.GrpcServiceName('google.pubsub.v1.Subscriber') +class SubscriberClient extends $grpc.Client { + /// The hostname for this service. + static const $core.String defaultHost = 'pubsub.googleapis.com'; + + /// OAuth scopes needed for the client. + static const $core.List<$core.String> oauthScopes = [ + 'https://www.googleapis.com/auth/cloud-platform', + 'https://www.googleapis.com/auth/pubsub', + ]; + + static final _$createSubscription = + $grpc.ClientMethod<$0.Subscription, $0.Subscription>( + '/google.pubsub.v1.Subscriber/CreateSubscription', + ($0.Subscription value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Subscription.fromBuffer(value)); + static final _$getSubscription = + $grpc.ClientMethod<$0.GetSubscriptionRequest, $0.Subscription>( + '/google.pubsub.v1.Subscriber/GetSubscription', + ($0.GetSubscriptionRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Subscription.fromBuffer(value)); + static final _$updateSubscription = + $grpc.ClientMethod<$0.UpdateSubscriptionRequest, $0.Subscription>( + '/google.pubsub.v1.Subscriber/UpdateSubscription', + ($0.UpdateSubscriptionRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Subscription.fromBuffer(value)); + static final _$listSubscriptions = $grpc.ClientMethod< + $0.ListSubscriptionsRequest, $0.ListSubscriptionsResponse>( + '/google.pubsub.v1.Subscriber/ListSubscriptions', + ($0.ListSubscriptionsRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.ListSubscriptionsResponse.fromBuffer(value)); + static final _$deleteSubscription = + $grpc.ClientMethod<$0.DeleteSubscriptionRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/DeleteSubscription', + ($0.DeleteSubscriptionRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); + static final _$modifyAckDeadline = + $grpc.ClientMethod<$0.ModifyAckDeadlineRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/ModifyAckDeadline', + ($0.ModifyAckDeadlineRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); + static final _$acknowledge = + $grpc.ClientMethod<$0.AcknowledgeRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/Acknowledge', + ($0.AcknowledgeRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); + static final _$pull = $grpc.ClientMethod<$0.PullRequest, $0.PullResponse>( + '/google.pubsub.v1.Subscriber/Pull', + ($0.PullRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PullResponse.fromBuffer(value)); + static final _$streamingPull = + $grpc.ClientMethod<$0.StreamingPullRequest, $0.StreamingPullResponse>( + '/google.pubsub.v1.Subscriber/StreamingPull', + ($0.StreamingPullRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.StreamingPullResponse.fromBuffer(value)); + static final _$modifyPushConfig = + $grpc.ClientMethod<$0.ModifyPushConfigRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/ModifyPushConfig', + ($0.ModifyPushConfigRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); + static final _$getSnapshot = + $grpc.ClientMethod<$0.GetSnapshotRequest, $0.Snapshot>( + '/google.pubsub.v1.Subscriber/GetSnapshot', + ($0.GetSnapshotRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Snapshot.fromBuffer(value)); + static final _$listSnapshots = + $grpc.ClientMethod<$0.ListSnapshotsRequest, $0.ListSnapshotsResponse>( + '/google.pubsub.v1.Subscriber/ListSnapshots', + ($0.ListSnapshotsRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.ListSnapshotsResponse.fromBuffer(value)); + static final _$createSnapshot = + $grpc.ClientMethod<$0.CreateSnapshotRequest, $0.Snapshot>( + '/google.pubsub.v1.Subscriber/CreateSnapshot', + ($0.CreateSnapshotRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Snapshot.fromBuffer(value)); + static final _$updateSnapshot = + $grpc.ClientMethod<$0.UpdateSnapshotRequest, $0.Snapshot>( + '/google.pubsub.v1.Subscriber/UpdateSnapshot', + ($0.UpdateSnapshotRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.Snapshot.fromBuffer(value)); + static final _$deleteSnapshot = + $grpc.ClientMethod<$0.DeleteSnapshotRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/DeleteSnapshot', + ($0.DeleteSnapshotRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); + static final _$seek = $grpc.ClientMethod<$0.SeekRequest, $0.SeekResponse>( + '/google.pubsub.v1.Subscriber/Seek', + ($0.SeekRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.SeekResponse.fromBuffer(value)); + + SubscriberClient(super.channel, {super.options, super.interceptors}); + + /// Creates a subscription to a given topic. See the [resource name rules] + /// (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). + /// If the subscription already exists, returns `ALREADY_EXISTS`. + /// If the corresponding topic doesn't exist, returns `NOT_FOUND`. + /// + /// If the name is not provided in the request, the server will assign a random + /// name for this subscription on the same project as the topic, conforming + /// to the [resource name format] + /// (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). The + /// generated name is populated in the returned Subscription object. Note that + /// for REST API requests, you must specify a name in the request. + $grpc.ResponseFuture<$0.Subscription> createSubscription( + $0.Subscription request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$createSubscription, request, options: options); + } + + /// Gets the configuration details of a subscription. + $grpc.ResponseFuture<$0.Subscription> getSubscription( + $0.GetSubscriptionRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$getSubscription, request, options: options); + } + + /// Updates an existing subscription by updating the fields specified in the + /// update mask. Note that certain properties of a subscription, such as its + /// topic, are not modifiable. + $grpc.ResponseFuture<$0.Subscription> updateSubscription( + $0.UpdateSubscriptionRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$updateSubscription, request, options: options); + } + + /// Lists matching subscriptions. + $grpc.ResponseFuture<$0.ListSubscriptionsResponse> listSubscriptions( + $0.ListSubscriptionsRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$listSubscriptions, request, options: options); + } + + /// Deletes an existing subscription. All messages retained in the subscription + /// are immediately dropped. Calls to `Pull` after deletion will return + /// `NOT_FOUND`. After a subscription is deleted, a new one may be created with + /// the same name, but the new one has no association with the old + /// subscription or its topic unless the same topic is specified. + $grpc.ResponseFuture<$1.Empty> deleteSubscription( + $0.DeleteSubscriptionRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$deleteSubscription, request, options: options); + } + + /// Modifies the ack deadline for a specific message. This method is useful + /// to indicate that more time is needed to process a message by the + /// subscriber, or to make the message available for redelivery if the + /// processing was interrupted. Note that this does not modify the + /// subscription-level `ackDeadlineSeconds` used for subsequent messages. + $grpc.ResponseFuture<$1.Empty> modifyAckDeadline( + $0.ModifyAckDeadlineRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$modifyAckDeadline, request, options: options); + } + + /// Acknowledges the messages associated with the `ack_ids` in the + /// `AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages + /// from the subscription. + /// + /// Acknowledging a message whose ack deadline has expired may succeed, + /// but such a message may be redelivered later. Acknowledging a message more + /// than once will not result in an error. + $grpc.ResponseFuture<$1.Empty> acknowledge($0.AcknowledgeRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$acknowledge, request, options: options); + } + + /// Pulls messages from the server. + $grpc.ResponseFuture<$0.PullResponse> pull($0.PullRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$pull, request, options: options); + } + + /// Establishes a stream with the server, which sends messages down to the + /// client. The client streams acknowledgments and ack deadline modifications + /// back to the server. The server will close the stream and return the status + /// on any error. The server may close the stream with status `UNAVAILABLE` to + /// reassign server-side resources, in which case, the client should + /// re-establish the stream. Flow control can be achieved by configuring the + /// underlying RPC channel. + $grpc.ResponseStream<$0.StreamingPullResponse> streamingPull( + $async.Stream<$0.StreamingPullRequest> request, + {$grpc.CallOptions? options}) { + return $createStreamingCall(_$streamingPull, request, options: options); + } + + /// Modifies the `PushConfig` for a specified subscription. + /// + /// This may be used to change a push subscription to a pull one (signified by + /// an empty `PushConfig`) or vice versa, or change the endpoint URL and other + /// attributes of a push subscription. Messages will accumulate for delivery + /// continuously through the call regardless of changes to the `PushConfig`. + $grpc.ResponseFuture<$1.Empty> modifyPushConfig( + $0.ModifyPushConfigRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$modifyPushConfig, request, options: options); + } + + /// Gets the configuration details of a snapshot. Snapshots are used in + /// [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, + /// which allow you to manage message acknowledgments in bulk. That is, you can + /// set the acknowledgment state of messages in an existing subscription to the + /// state captured by a snapshot. + $grpc.ResponseFuture<$0.Snapshot> getSnapshot($0.GetSnapshotRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$getSnapshot, request, options: options); + } + + /// Lists the existing snapshots. Snapshots are used in [Seek]( + /// https://cloud.google.com/pubsub/docs/replay-overview) operations, which + /// allow you to manage message acknowledgments in bulk. That is, you can set + /// the acknowledgment state of messages in an existing subscription to the + /// state captured by a snapshot. + $grpc.ResponseFuture<$0.ListSnapshotsResponse> listSnapshots( + $0.ListSnapshotsRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$listSnapshots, request, options: options); + } + + /// Creates a snapshot from the requested subscription. Snapshots are used in + /// [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, + /// which allow you to manage message acknowledgments in bulk. That is, you can + /// set the acknowledgment state of messages in an existing subscription to the + /// state captured by a snapshot. + /// If the snapshot already exists, returns `ALREADY_EXISTS`. + /// If the requested subscription doesn't exist, returns `NOT_FOUND`. + /// If the backlog in the subscription is too old -- and the resulting snapshot + /// would expire in less than 1 hour -- then `FAILED_PRECONDITION` is returned. + /// See also the `Snapshot.expire_time` field. If the name is not provided in + /// the request, the server will assign a random + /// name for this snapshot on the same project as the subscription, conforming + /// to the [resource name format] + /// (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). The + /// generated name is populated in the returned Snapshot object. Note that for + /// REST API requests, you must specify a name in the request. + $grpc.ResponseFuture<$0.Snapshot> createSnapshot( + $0.CreateSnapshotRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$createSnapshot, request, options: options); + } + + /// Updates an existing snapshot by updating the fields specified in the update + /// mask. Snapshots are used in + /// [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, + /// which allow you to manage message acknowledgments in bulk. That is, you can + /// set the acknowledgment state of messages in an existing subscription to the + /// state captured by a snapshot. + $grpc.ResponseFuture<$0.Snapshot> updateSnapshot( + $0.UpdateSnapshotRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$updateSnapshot, request, options: options); + } + + /// Removes an existing snapshot. Snapshots are used in [Seek] + /// (https://cloud.google.com/pubsub/docs/replay-overview) operations, which + /// allow you to manage message acknowledgments in bulk. That is, you can set + /// the acknowledgment state of messages in an existing subscription to the + /// state captured by a snapshot. + /// When the snapshot is deleted, all messages retained in the snapshot + /// are immediately dropped. After a snapshot is deleted, a new one may be + /// created with the same name, but the new one has no association with the old + /// snapshot or its subscription, unless the same subscription is specified. + $grpc.ResponseFuture<$1.Empty> deleteSnapshot( + $0.DeleteSnapshotRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$deleteSnapshot, request, options: options); + } + + /// Seeks an existing subscription to a point in time or to a given snapshot, + /// whichever is provided in the request. Snapshots are used in [Seek] + /// (https://cloud.google.com/pubsub/docs/replay-overview) operations, which + /// allow you to manage message acknowledgments in bulk. That is, you can set + /// the acknowledgment state of messages in an existing subscription to the + /// state captured by a snapshot. Note that both the subscription and the + /// snapshot must be on the same topic. + $grpc.ResponseFuture<$0.SeekResponse> seek($0.SeekRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$seek, request, options: options); + } +} + +@$pb.GrpcServiceName('google.pubsub.v1.Subscriber') +abstract class SubscriberServiceBase extends $grpc.Service { + $core.String get $name => 'google.pubsub.v1.Subscriber'; + + SubscriberServiceBase() { + $addMethod($grpc.ServiceMethod<$0.Subscription, $0.Subscription>( + 'CreateSubscription', + createSubscription_Pre, + false, + false, + ($core.List<$core.int> value) => $0.Subscription.fromBuffer(value), + ($0.Subscription value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.GetSubscriptionRequest, $0.Subscription>( + 'GetSubscription', + getSubscription_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.GetSubscriptionRequest.fromBuffer(value), + ($0.Subscription value) => value.writeToBuffer())); + $addMethod( + $grpc.ServiceMethod<$0.UpdateSubscriptionRequest, $0.Subscription>( + 'UpdateSubscription', + updateSubscription_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.UpdateSubscriptionRequest.fromBuffer(value), + ($0.Subscription value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.ListSubscriptionsRequest, + $0.ListSubscriptionsResponse>( + 'ListSubscriptions', + listSubscriptions_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.ListSubscriptionsRequest.fromBuffer(value), + ($0.ListSubscriptionsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.DeleteSubscriptionRequest, $1.Empty>( + 'DeleteSubscription', + deleteSubscription_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.DeleteSubscriptionRequest.fromBuffer(value), + ($1.Empty value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.ModifyAckDeadlineRequest, $1.Empty>( + 'ModifyAckDeadline', + modifyAckDeadline_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.ModifyAckDeadlineRequest.fromBuffer(value), + ($1.Empty value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.AcknowledgeRequest, $1.Empty>( + 'Acknowledge', + acknowledge_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.AcknowledgeRequest.fromBuffer(value), + ($1.Empty value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PullRequest, $0.PullResponse>( + 'Pull', + pull_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PullRequest.fromBuffer(value), + ($0.PullResponse value) => value.writeToBuffer())); + $addMethod( + $grpc.ServiceMethod<$0.StreamingPullRequest, $0.StreamingPullResponse>( + 'StreamingPull', + streamingPull, + true, + true, + ($core.List<$core.int> value) => + $0.StreamingPullRequest.fromBuffer(value), + ($0.StreamingPullResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.ModifyPushConfigRequest, $1.Empty>( + 'ModifyPushConfig', + modifyPushConfig_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.ModifyPushConfigRequest.fromBuffer(value), + ($1.Empty value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.GetSnapshotRequest, $0.Snapshot>( + 'GetSnapshot', + getSnapshot_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.GetSnapshotRequest.fromBuffer(value), + ($0.Snapshot value) => value.writeToBuffer())); + $addMethod( + $grpc.ServiceMethod<$0.ListSnapshotsRequest, $0.ListSnapshotsResponse>( + 'ListSnapshots', + listSnapshots_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.ListSnapshotsRequest.fromBuffer(value), + ($0.ListSnapshotsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.CreateSnapshotRequest, $0.Snapshot>( + 'CreateSnapshot', + createSnapshot_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.CreateSnapshotRequest.fromBuffer(value), + ($0.Snapshot value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.UpdateSnapshotRequest, $0.Snapshot>( + 'UpdateSnapshot', + updateSnapshot_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.UpdateSnapshotRequest.fromBuffer(value), + ($0.Snapshot value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.DeleteSnapshotRequest, $1.Empty>( + 'DeleteSnapshot', + deleteSnapshot_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.DeleteSnapshotRequest.fromBuffer(value), + ($1.Empty value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.SeekRequest, $0.SeekResponse>( + 'Seek', + seek_Pre, + false, + false, + ($core.List<$core.int> value) => $0.SeekRequest.fromBuffer(value), + ($0.SeekResponse value) => value.writeToBuffer())); + } + + $async.Future<$0.Subscription> createSubscription_Pre( + $grpc.ServiceCall $call, $async.Future<$0.Subscription> $request) async { + return createSubscription($call, await $request); + } + + $async.Future<$0.Subscription> getSubscription_Pre($grpc.ServiceCall $call, + $async.Future<$0.GetSubscriptionRequest> $request) async { + return getSubscription($call, await $request); + } + + $async.Future<$0.Subscription> updateSubscription_Pre($grpc.ServiceCall $call, + $async.Future<$0.UpdateSubscriptionRequest> $request) async { + return updateSubscription($call, await $request); + } + + $async.Future<$0.ListSubscriptionsResponse> listSubscriptions_Pre( + $grpc.ServiceCall $call, + $async.Future<$0.ListSubscriptionsRequest> $request) async { + return listSubscriptions($call, await $request); + } + + $async.Future<$1.Empty> deleteSubscription_Pre($grpc.ServiceCall $call, + $async.Future<$0.DeleteSubscriptionRequest> $request) async { + return deleteSubscription($call, await $request); + } + + $async.Future<$1.Empty> modifyAckDeadline_Pre($grpc.ServiceCall $call, + $async.Future<$0.ModifyAckDeadlineRequest> $request) async { + return modifyAckDeadline($call, await $request); + } + + $async.Future<$1.Empty> acknowledge_Pre($grpc.ServiceCall $call, + $async.Future<$0.AcknowledgeRequest> $request) async { + return acknowledge($call, await $request); + } + + $async.Future<$0.PullResponse> pull_Pre( + $grpc.ServiceCall $call, $async.Future<$0.PullRequest> $request) async { + return pull($call, await $request); + } + + $async.Future<$1.Empty> modifyPushConfig_Pre($grpc.ServiceCall $call, + $async.Future<$0.ModifyPushConfigRequest> $request) async { + return modifyPushConfig($call, await $request); + } + + $async.Future<$0.Snapshot> getSnapshot_Pre($grpc.ServiceCall $call, + $async.Future<$0.GetSnapshotRequest> $request) async { + return getSnapshot($call, await $request); + } + + $async.Future<$0.ListSnapshotsResponse> listSnapshots_Pre( + $grpc.ServiceCall $call, + $async.Future<$0.ListSnapshotsRequest> $request) async { + return listSnapshots($call, await $request); + } + + $async.Future<$0.Snapshot> createSnapshot_Pre($grpc.ServiceCall $call, + $async.Future<$0.CreateSnapshotRequest> $request) async { + return createSnapshot($call, await $request); + } + + $async.Future<$0.Snapshot> updateSnapshot_Pre($grpc.ServiceCall $call, + $async.Future<$0.UpdateSnapshotRequest> $request) async { + return updateSnapshot($call, await $request); + } + + $async.Future<$1.Empty> deleteSnapshot_Pre($grpc.ServiceCall $call, + $async.Future<$0.DeleteSnapshotRequest> $request) async { + return deleteSnapshot($call, await $request); + } + + $async.Future<$0.SeekResponse> seek_Pre( + $grpc.ServiceCall $call, $async.Future<$0.SeekRequest> $request) async { + return seek($call, await $request); + } + + $async.Future<$0.Subscription> createSubscription( + $grpc.ServiceCall call, $0.Subscription request); + $async.Future<$0.Subscription> getSubscription( + $grpc.ServiceCall call, $0.GetSubscriptionRequest request); + $async.Future<$0.Subscription> updateSubscription( + $grpc.ServiceCall call, $0.UpdateSubscriptionRequest request); + $async.Future<$0.ListSubscriptionsResponse> listSubscriptions( + $grpc.ServiceCall call, $0.ListSubscriptionsRequest request); + $async.Future<$1.Empty> deleteSubscription( + $grpc.ServiceCall call, $0.DeleteSubscriptionRequest request); + $async.Future<$1.Empty> modifyAckDeadline( + $grpc.ServiceCall call, $0.ModifyAckDeadlineRequest request); + $async.Future<$1.Empty> acknowledge( + $grpc.ServiceCall call, $0.AcknowledgeRequest request); + $async.Future<$0.PullResponse> pull( + $grpc.ServiceCall call, $0.PullRequest request); + $async.Stream<$0.StreamingPullResponse> streamingPull( + $grpc.ServiceCall call, $async.Stream<$0.StreamingPullRequest> request); + $async.Future<$1.Empty> modifyPushConfig( + $grpc.ServiceCall call, $0.ModifyPushConfigRequest request); + $async.Future<$0.Snapshot> getSnapshot( + $grpc.ServiceCall call, $0.GetSnapshotRequest request); + $async.Future<$0.ListSnapshotsResponse> listSnapshots( + $grpc.ServiceCall call, $0.ListSnapshotsRequest request); + $async.Future<$0.Snapshot> createSnapshot( + $grpc.ServiceCall call, $0.CreateSnapshotRequest request); + $async.Future<$0.Snapshot> updateSnapshot( + $grpc.ServiceCall call, $0.UpdateSnapshotRequest request); + $async.Future<$1.Empty> deleteSnapshot( + $grpc.ServiceCall call, $0.DeleteSnapshotRequest request); + $async.Future<$0.SeekResponse> seek( + $grpc.ServiceCall call, $0.SeekRequest request); +} diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbjson.dart new file mode 100644 index 00000000..b1a20bf1 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbjson.dart @@ -0,0 +1,3139 @@ +// +// Generated code. Do not modify. +// source: google/pubsub/v1/pubsub.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use messageStoragePolicyDescriptor instead') +const MessageStoragePolicy$json = { + '1': 'MessageStoragePolicy', + '2': [ + { + '1': 'allowed_persistence_regions', + '3': 1, + '4': 3, + '5': 9, + '8': {}, + '10': 'allowedPersistenceRegions' + }, + { + '1': 'enforce_in_transit', + '3': 2, + '4': 1, + '5': 8, + '8': {}, + '10': 'enforceInTransit' + }, + ], +}; + +/// Descriptor for `MessageStoragePolicy`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List messageStoragePolicyDescriptor = $convert.base64Decode( + 'ChRNZXNzYWdlU3RvcmFnZVBvbGljeRJDChthbGxvd2VkX3BlcnNpc3RlbmNlX3JlZ2lvbnMYAS' + 'ADKAlCA+BBAVIZYWxsb3dlZFBlcnNpc3RlbmNlUmVnaW9ucxIxChJlbmZvcmNlX2luX3RyYW5z' + 'aXQYAiABKAhCA+BBAVIQZW5mb3JjZUluVHJhbnNpdA=='); + +@$core.Deprecated('Use schemaSettingsDescriptor instead') +const SchemaSettings$json = { + '1': 'SchemaSettings', + '2': [ + {'1': 'schema', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'schema'}, + { + '1': 'encoding', + '3': 2, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.Encoding', + '8': {}, + '10': 'encoding' + }, + { + '1': 'first_revision_id', + '3': 3, + '4': 1, + '5': 9, + '8': {}, + '10': 'firstRevisionId' + }, + { + '1': 'last_revision_id', + '3': 4, + '4': 1, + '5': 9, + '8': {}, + '10': 'lastRevisionId' + }, + ], +}; + +/// Descriptor for `SchemaSettings`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List schemaSettingsDescriptor = $convert.base64Decode( + 'Cg5TY2hlbWFTZXR0aW5ncxI8CgZzY2hlbWEYASABKAlCJOBBAvpBHgoccHVic3ViLmdvb2dsZW' + 'FwaXMuY29tL1NjaGVtYVIGc2NoZW1hEjsKCGVuY29kaW5nGAIgASgOMhouZ29vZ2xlLnB1YnN1' + 'Yi52MS5FbmNvZGluZ0ID4EEBUghlbmNvZGluZxIvChFmaXJzdF9yZXZpc2lvbl9pZBgDIAEoCU' + 'ID4EEBUg9maXJzdFJldmlzaW9uSWQSLQoQbGFzdF9yZXZpc2lvbl9pZBgEIAEoCUID4EEBUg5s' + 'YXN0UmV2aXNpb25JZA=='); + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings$json = { + '1': 'IngestionDataSourceSettings', + '2': [ + { + '1': 'aws_kinesis', + '3': 1, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.AwsKinesis', + '8': {}, + '9': 0, + '10': 'awsKinesis' + }, + { + '1': 'cloud_storage', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage', + '8': {}, + '9': 0, + '10': 'cloudStorage' + }, + { + '1': 'azure_event_hubs', + '3': 3, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.AzureEventHubs', + '8': {}, + '9': 0, + '10': 'azureEventHubs' + }, + { + '1': 'aws_msk', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.AwsMsk', + '8': {}, + '9': 0, + '10': 'awsMsk' + }, + { + '1': 'confluent_cloud', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.ConfluentCloud', + '8': {}, + '9': 0, + '10': 'confluentCloud' + }, + { + '1': 'platform_logs_settings', + '3': 4, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.PlatformLogsSettings', + '8': {}, + '10': 'platformLogsSettings' + }, + ], + '3': [ + IngestionDataSourceSettings_AwsKinesis$json, + IngestionDataSourceSettings_CloudStorage$json, + IngestionDataSourceSettings_AzureEventHubs$json, + IngestionDataSourceSettings_AwsMsk$json, + IngestionDataSourceSettings_ConfluentCloud$json + ], + '8': [ + {'1': 'source'}, + ], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_AwsKinesis$json = { + '1': 'AwsKinesis', + '2': [ + { + '1': 'state', + '3': 1, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.AwsKinesis.State', + '8': {}, + '10': 'state' + }, + {'1': 'stream_arn', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'streamArn'}, + {'1': 'consumer_arn', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'consumerArn'}, + {'1': 'aws_role_arn', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'awsRoleArn'}, + { + '1': 'gcp_service_account', + '3': 5, + '4': 1, + '5': 9, + '8': {}, + '10': 'gcpServiceAccount' + }, + ], + '4': [IngestionDataSourceSettings_AwsKinesis_State$json], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_AwsKinesis_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'KINESIS_PERMISSION_DENIED', '2': 2}, + {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, + {'1': 'STREAM_NOT_FOUND', '2': 4}, + {'1': 'CONSUMER_NOT_FOUND', '2': 5}, + ], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_CloudStorage$json = { + '1': 'CloudStorage', + '2': [ + { + '1': 'state', + '3': 1, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage.State', + '8': {}, + '10': 'state' + }, + {'1': 'bucket', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'bucket'}, + { + '1': 'text_format', + '3': 3, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage.TextFormat', + '8': {}, + '9': 0, + '10': 'textFormat' + }, + { + '1': 'avro_format', + '3': 4, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage.AvroFormat', + '8': {}, + '9': 0, + '10': 'avroFormat' + }, + { + '1': 'pubsub_avro_format', + '3': 5, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage.PubSubAvroFormat', + '8': {}, + '9': 0, + '10': 'pubsubAvroFormat' + }, + { + '1': 'minimum_object_create_time', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.protobuf.Timestamp', + '8': {}, + '10': 'minimumObjectCreateTime' + }, + {'1': 'match_glob', '3': 9, '4': 1, '5': 9, '8': {}, '10': 'matchGlob'}, + ], + '3': [ + IngestionDataSourceSettings_CloudStorage_TextFormat$json, + IngestionDataSourceSettings_CloudStorage_AvroFormat$json, + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat$json + ], + '4': [IngestionDataSourceSettings_CloudStorage_State$json], + '8': [ + {'1': 'input_format'}, + ], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_CloudStorage_TextFormat$json = { + '1': 'TextFormat', + '2': [ + { + '1': 'delimiter', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '9': 0, + '10': 'delimiter', + '17': true + }, + ], + '8': [ + {'1': '_delimiter'}, + ], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_CloudStorage_AvroFormat$json = { + '1': 'AvroFormat', +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat$json = { + '1': 'PubSubAvroFormat', +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_CloudStorage_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'CLOUD_STORAGE_PERMISSION_DENIED', '2': 2}, + {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, + {'1': 'BUCKET_NOT_FOUND', '2': 4}, + {'1': 'TOO_MANY_OBJECTS', '2': 5}, + ], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_AzureEventHubs$json = { + '1': 'AzureEventHubs', + '2': [ + { + '1': 'state', + '3': 1, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.AzureEventHubs.State', + '8': {}, + '10': 'state' + }, + { + '1': 'resource_group', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'resourceGroup' + }, + {'1': 'namespace', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'namespace'}, + {'1': 'event_hub', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'eventHub'}, + {'1': 'client_id', '3': 5, '4': 1, '5': 9, '8': {}, '10': 'clientId'}, + {'1': 'tenant_id', '3': 6, '4': 1, '5': 9, '8': {}, '10': 'tenantId'}, + { + '1': 'subscription_id', + '3': 7, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscriptionId' + }, + { + '1': 'gcp_service_account', + '3': 8, + '4': 1, + '5': 9, + '8': {}, + '10': 'gcpServiceAccount' + }, + ], + '4': [IngestionDataSourceSettings_AzureEventHubs_State$json], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_AzureEventHubs_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'EVENT_HUBS_PERMISSION_DENIED', '2': 2}, + {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, + {'1': 'NAMESPACE_NOT_FOUND', '2': 4}, + {'1': 'EVENT_HUB_NOT_FOUND', '2': 5}, + {'1': 'SUBSCRIPTION_NOT_FOUND', '2': 6}, + {'1': 'RESOURCE_GROUP_NOT_FOUND', '2': 7}, + ], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_AwsMsk$json = { + '1': 'AwsMsk', + '2': [ + { + '1': 'state', + '3': 1, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.AwsMsk.State', + '8': {}, + '10': 'state' + }, + {'1': 'cluster_arn', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'clusterArn'}, + {'1': 'topic', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + {'1': 'aws_role_arn', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'awsRoleArn'}, + { + '1': 'gcp_service_account', + '3': 5, + '4': 1, + '5': 9, + '8': {}, + '10': 'gcpServiceAccount' + }, + ], + '4': [IngestionDataSourceSettings_AwsMsk_State$json], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_AwsMsk_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'MSK_PERMISSION_DENIED', '2': 2}, + {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, + {'1': 'CLUSTER_NOT_FOUND', '2': 4}, + {'1': 'TOPIC_NOT_FOUND', '2': 5}, + ], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_ConfluentCloud$json = { + '1': 'ConfluentCloud', + '2': [ + { + '1': 'state', + '3': 1, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.IngestionDataSourceSettings.ConfluentCloud.State', + '8': {}, + '10': 'state' + }, + { + '1': 'bootstrap_server', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'bootstrapServer' + }, + {'1': 'cluster_id', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'clusterId'}, + {'1': 'topic', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + { + '1': 'identity_pool_id', + '3': 5, + '4': 1, + '5': 9, + '8': {}, + '10': 'identityPoolId' + }, + { + '1': 'gcp_service_account', + '3': 6, + '4': 1, + '5': 9, + '8': {}, + '10': 'gcpServiceAccount' + }, + ], + '4': [IngestionDataSourceSettings_ConfluentCloud_State$json], +}; + +@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') +const IngestionDataSourceSettings_ConfluentCloud_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'CONFLUENT_CLOUD_PERMISSION_DENIED', '2': 2}, + {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, + {'1': 'UNREACHABLE_BOOTSTRAP_SERVER', '2': 4}, + {'1': 'CLUSTER_NOT_FOUND', '2': 5}, + {'1': 'TOPIC_NOT_FOUND', '2': 6}, + ], +}; + +/// Descriptor for `IngestionDataSourceSettings`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List ingestionDataSourceSettingsDescriptor = $convert.base64Decode( + 'ChtJbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MSYAoLYXdzX2tpbmVzaXMYASABKAsyOC5nb2' + '9nbGUucHVic3ViLnYxLkluZ2VzdGlvbkRhdGFTb3VyY2VTZXR0aW5ncy5Bd3NLaW5lc2lzQgPg' + 'QQFIAFIKYXdzS2luZXNpcxJmCg1jbG91ZF9zdG9yYWdlGAIgASgLMjouZ29vZ2xlLnB1YnN1Yi' + '52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MuQ2xvdWRTdG9yYWdlQgPgQQFIAFIMY2xv' + 'dWRTdG9yYWdlEm0KEGF6dXJlX2V2ZW50X2h1YnMYAyABKAsyPC5nb29nbGUucHVic3ViLnYxLk' + 'luZ2VzdGlvbkRhdGFTb3VyY2VTZXR0aW5ncy5BenVyZUV2ZW50SHVic0ID4EEBSABSDmF6dXJl' + 'RXZlbnRIdWJzElQKB2F3c19tc2sYBSABKAsyNC5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbk' + 'RhdGFTb3VyY2VTZXR0aW5ncy5Bd3NNc2tCA+BBAUgAUgZhd3NNc2sSbAoPY29uZmx1ZW50X2Ns' + 'b3VkGAYgASgLMjwuZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3' + 'MuQ29uZmx1ZW50Q2xvdWRCA+BBAUgAUg5jb25mbHVlbnRDbG91ZBJhChZwbGF0Zm9ybV9sb2dz' + 'X3NldHRpbmdzGAQgASgLMiYuZ29vZ2xlLnB1YnN1Yi52MS5QbGF0Zm9ybUxvZ3NTZXR0aW5nc0' + 'ID4EEBUhRwbGF0Zm9ybUxvZ3NTZXR0aW5ncxqoAwoKQXdzS2luZXNpcxJZCgVzdGF0ZRgBIAEo' + 'DjI+Lmdvb2dsZS5wdWJzdWIudjEuSW5nZXN0aW9uRGF0YVNvdXJjZVNldHRpbmdzLkF3c0tpbm' + 'VzaXMuU3RhdGVCA+BBA1IFc3RhdGUSIgoKc3RyZWFtX2FybhgCIAEoCUID4EECUglzdHJlYW1B' + 'cm4SJgoMY29uc3VtZXJfYXJuGAMgASgJQgPgQQJSC2NvbnN1bWVyQXJuEiUKDGF3c19yb2xlX2' + 'FybhgEIAEoCUID4EECUgphd3NSb2xlQXJuEjMKE2djcF9zZXJ2aWNlX2FjY291bnQYBSABKAlC' + 'A+BBAlIRZ2NwU2VydmljZUFjY291bnQilgEKBVN0YXRlEhUKEVNUQVRFX1VOU1BFQ0lGSUVEEA' + 'ASCgoGQUNUSVZFEAESHQoZS0lORVNJU19QRVJNSVNTSU9OX0RFTklFRBACEh0KGVBVQkxJU0hf' + 'UEVSTUlTU0lPTl9ERU5JRUQQAxIUChBTVFJFQU1fTk9UX0ZPVU5EEAQSFgoSQ09OU1VNRVJfTk' + '9UX0ZPVU5EEAUa/gYKDENsb3VkU3RvcmFnZRJbCgVzdGF0ZRgBIAEoDjJALmdvb2dsZS5wdWJz' + 'dWIudjEuSW5nZXN0aW9uRGF0YVNvdXJjZVNldHRpbmdzLkNsb3VkU3RvcmFnZS5TdGF0ZUID4E' + 'EDUgVzdGF0ZRIbCgZidWNrZXQYAiABKAlCA+BBAVIGYnVja2V0Em0KC3RleHRfZm9ybWF0GAMg' + 'ASgLMkUuZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MuQ2xvdW' + 'RTdG9yYWdlLlRleHRGb3JtYXRCA+BBAUgAUgp0ZXh0Rm9ybWF0Em0KC2F2cm9fZm9ybWF0GAQg' + 'ASgLMkUuZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MuQ2xvdW' + 'RTdG9yYWdlLkF2cm9Gb3JtYXRCA+BBAUgAUgphdnJvRm9ybWF0EoABChJwdWJzdWJfYXZyb19m' + 'b3JtYXQYBSABKAsySy5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkRhdGFTb3VyY2VTZXR0aW' + '5ncy5DbG91ZFN0b3JhZ2UuUHViU3ViQXZyb0Zvcm1hdEID4EEBSABSEHB1YnN1YkF2cm9Gb3Jt' + 'YXQSXAoabWluaW11bV9vYmplY3RfY3JlYXRlX3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idW' + 'YuVGltZXN0YW1wQgPgQQFSF21pbmltdW1PYmplY3RDcmVhdGVUaW1lEiIKCm1hdGNoX2dsb2IY' + 'CSABKAlCA+BBAVIJbWF0Y2hHbG9iGkIKClRleHRGb3JtYXQSJgoJZGVsaW1pdGVyGAEgASgJQg' + 'PgQQFIAFIJZGVsaW1pdGVyiAEBQgwKCl9kZWxpbWl0ZXIaDAoKQXZyb0Zvcm1hdBoSChBQdWJT' + 'dWJBdnJvRm9ybWF0IpoBCgVTdGF0ZRIVChFTVEFURV9VTlNQRUNJRklFRBAAEgoKBkFDVElWRR' + 'ABEiMKH0NMT1VEX1NUT1JBR0VfUEVSTUlTU0lPTl9ERU5JRUQQAhIdChlQVUJMSVNIX1BFUk1J' + 'U1NJT05fREVOSUVEEAMSFAoQQlVDS0VUX05PVF9GT1VORBAEEhQKEFRPT19NQU5ZX09CSkVDVF' + 'MQBUIOCgxpbnB1dF9mb3JtYXQa4QQKDkF6dXJlRXZlbnRIdWJzEl0KBXN0YXRlGAEgASgOMkIu' + 'Z29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MuQXp1cmVFdmVudE' + 'h1YnMuU3RhdGVCA+BBA1IFc3RhdGUSKgoOcmVzb3VyY2VfZ3JvdXAYAiABKAlCA+BBAVINcmVz' + 'b3VyY2VHcm91cBIhCgluYW1lc3BhY2UYAyABKAlCA+BBAVIJbmFtZXNwYWNlEiAKCWV2ZW50X2' + 'h1YhgEIAEoCUID4EEBUghldmVudEh1YhIgCgljbGllbnRfaWQYBSABKAlCA+BBAVIIY2xpZW50' + 'SWQSIAoJdGVuYW50X2lkGAYgASgJQgPgQQFSCHRlbmFudElkEiwKD3N1YnNjcmlwdGlvbl9pZB' + 'gHIAEoCUID4EEBUg5zdWJzY3JpcHRpb25JZBIzChNnY3Bfc2VydmljZV9hY2NvdW50GAggASgJ' + 'QgPgQQFSEWdjcFNlcnZpY2VBY2NvdW50ItcBCgVTdGF0ZRIVChFTVEFURV9VTlNQRUNJRklFRB' + 'AAEgoKBkFDVElWRRABEiAKHEVWRU5UX0hVQlNfUEVSTUlTU0lPTl9ERU5JRUQQAhIdChlQVUJM' + 'SVNIX1BFUk1JU1NJT05fREVOSUVEEAMSFwoTTkFNRVNQQUNFX05PVF9GT1VORBAEEhcKE0VWRU' + '5UX0hVQl9OT1RfRk9VTkQQBRIaChZTVUJTQ1JJUFRJT05fTk9UX0ZPVU5EEAYSHAoYUkVTT1VS' + 'Q0VfR1JPVVBfTk9UX0ZPVU5EEAcarwMKBkF3c01zaxJVCgVzdGF0ZRgBIAEoDjI6Lmdvb2dsZS' + '5wdWJzdWIudjEuSW5nZXN0aW9uRGF0YVNvdXJjZVNldHRpbmdzLkF3c01zay5TdGF0ZUID4EED' + 'UgVzdGF0ZRIkCgtjbHVzdGVyX2FybhgCIAEoCUID4EECUgpjbHVzdGVyQXJuEjkKBXRvcGljGA' + 'MgASgJQiPgQQL6QR0KG3B1YnN1Yi5nb29nbGVhcGlzLmNvbS9Ub3BpY1IFdG9waWMSJQoMYXdz' + 'X3JvbGVfYXJuGAQgASgJQgPgQQJSCmF3c1JvbGVBcm4SMwoTZ2NwX3NlcnZpY2VfYWNjb3VudB' + 'gFIAEoCUID4EECUhFnY3BTZXJ2aWNlQWNjb3VudCKQAQoFU3RhdGUSFQoRU1RBVEVfVU5TUEVD' + 'SUZJRUQQABIKCgZBQ1RJVkUQARIZChVNU0tfUEVSTUlTU0lPTl9ERU5JRUQQAhIdChlQVUJMSV' + 'NIX1BFUk1JU1NJT05fREVOSUVEEAMSFQoRQ0xVU1RFUl9OT1RfRk9VTkQQBBITCg9UT1BJQ19O' + 'T1RfRk9VTkQQBRqDBAoOQ29uZmx1ZW50Q2xvdWQSXQoFc3RhdGUYASABKA4yQi5nb29nbGUucH' + 'Vic3ViLnYxLkluZ2VzdGlvbkRhdGFTb3VyY2VTZXR0aW5ncy5Db25mbHVlbnRDbG91ZC5TdGF0' + 'ZUID4EEDUgVzdGF0ZRIuChBib290c3RyYXBfc2VydmVyGAIgASgJQgPgQQJSD2Jvb3RzdHJhcF' + 'NlcnZlchIiCgpjbHVzdGVyX2lkGAMgASgJQgPgQQJSCWNsdXN0ZXJJZBIZCgV0b3BpYxgEIAEo' + 'CUID4EECUgV0b3BpYxItChBpZGVudGl0eV9wb29sX2lkGAUgASgJQgPgQQJSDmlkZW50aXR5UG' + '9vbElkEjMKE2djcF9zZXJ2aWNlX2FjY291bnQYBiABKAlCA+BBAlIRZ2NwU2VydmljZUFjY291' + 'bnQivgEKBVN0YXRlEhUKEVNUQVRFX1VOU1BFQ0lGSUVEEAASCgoGQUNUSVZFEAESJQohQ09ORk' + 'xVRU5UX0NMT1VEX1BFUk1JU1NJT05fREVOSUVEEAISHQoZUFVCTElTSF9QRVJNSVNTSU9OX0RF' + 'TklFRBADEiAKHFVOUkVBQ0hBQkxFX0JPT1RTVFJBUF9TRVJWRVIQBBIVChFDTFVTVEVSX05PVF' + '9GT1VORBAFEhMKD1RPUElDX05PVF9GT1VORBAGQggKBnNvdXJjZQ=='); + +@$core.Deprecated('Use platformLogsSettingsDescriptor instead') +const PlatformLogsSettings$json = { + '1': 'PlatformLogsSettings', + '2': [ + { + '1': 'severity', + '3': 1, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.PlatformLogsSettings.Severity', + '8': {}, + '10': 'severity' + }, + ], + '4': [PlatformLogsSettings_Severity$json], +}; + +@$core.Deprecated('Use platformLogsSettingsDescriptor instead') +const PlatformLogsSettings_Severity$json = { + '1': 'Severity', + '2': [ + {'1': 'SEVERITY_UNSPECIFIED', '2': 0}, + {'1': 'DISABLED', '2': 1}, + {'1': 'DEBUG', '2': 2}, + {'1': 'INFO', '2': 3}, + {'1': 'WARNING', '2': 4}, + {'1': 'ERROR', '2': 5}, + ], +}; + +/// Descriptor for `PlatformLogsSettings`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List platformLogsSettingsDescriptor = $convert.base64Decode( + 'ChRQbGF0Zm9ybUxvZ3NTZXR0aW5ncxJQCghzZXZlcml0eRgBIAEoDjIvLmdvb2dsZS5wdWJzdW' + 'IudjEuUGxhdGZvcm1Mb2dzU2V0dGluZ3MuU2V2ZXJpdHlCA+BBAVIIc2V2ZXJpdHkiXwoIU2V2' + 'ZXJpdHkSGAoUU0VWRVJJVFlfVU5TUEVDSUZJRUQQABIMCghESVNBQkxFRBABEgkKBURFQlVHEA' + 'ISCAoESU5GTxADEgsKB1dBUk5JTkcQBBIJCgVFUlJPUhAF'); + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent$json = { + '1': 'IngestionFailureEvent', + '2': [ + {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + { + '1': 'error_message', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'errorMessage' + }, + { + '1': 'cloud_storage_failure', + '3': 3, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.CloudStorageFailure', + '8': {}, + '9': 0, + '10': 'cloudStorageFailure' + }, + { + '1': 'aws_msk_failure', + '3': 4, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.AwsMskFailureReason', + '8': {}, + '9': 0, + '10': 'awsMskFailure' + }, + { + '1': 'azure_event_hubs_failure', + '3': 5, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionFailureEvent.AzureEventHubsFailureReason', + '8': {}, + '9': 0, + '10': 'azureEventHubsFailure' + }, + { + '1': 'confluent_cloud_failure', + '3': 6, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionFailureEvent.ConfluentCloudFailureReason', + '8': {}, + '9': 0, + '10': 'confluentCloudFailure' + }, + { + '1': 'aws_kinesis_failure', + '3': 7, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.AwsKinesisFailureReason', + '8': {}, + '9': 0, + '10': 'awsKinesisFailure' + }, + ], + '3': [ + IngestionFailureEvent_ApiViolationReason$json, + IngestionFailureEvent_AvroFailureReason$json, + IngestionFailureEvent_SchemaViolationReason$json, + IngestionFailureEvent_MessageTransformationFailureReason$json, + IngestionFailureEvent_CloudStorageFailure$json, + IngestionFailureEvent_AwsMskFailureReason$json, + IngestionFailureEvent_AzureEventHubsFailureReason$json, + IngestionFailureEvent_ConfluentCloudFailureReason$json, + IngestionFailureEvent_AwsKinesisFailureReason$json + ], + '8': [ + {'1': 'failure'}, + ], +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_ApiViolationReason$json = { + '1': 'ApiViolationReason', +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_AvroFailureReason$json = { + '1': 'AvroFailureReason', +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_SchemaViolationReason$json = { + '1': 'SchemaViolationReason', +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_MessageTransformationFailureReason$json = { + '1': 'MessageTransformationFailureReason', +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_CloudStorageFailure$json = { + '1': 'CloudStorageFailure', + '2': [ + {'1': 'bucket', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'bucket'}, + {'1': 'object_name', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'objectName'}, + { + '1': 'object_generation', + '3': 3, + '4': 1, + '5': 3, + '8': {}, + '10': 'objectGeneration' + }, + { + '1': 'avro_failure_reason', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.AvroFailureReason', + '8': {}, + '9': 0, + '10': 'avroFailureReason' + }, + { + '1': 'api_violation_reason', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', + '8': {}, + '9': 0, + '10': 'apiViolationReason' + }, + { + '1': 'schema_violation_reason', + '3': 7, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', + '8': {}, + '9': 0, + '10': 'schemaViolationReason' + }, + { + '1': 'message_transformation_failure_reason', + '3': 8, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', + '8': {}, + '9': 0, + '10': 'messageTransformationFailureReason' + }, + ], + '8': [ + {'1': 'reason'}, + ], +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_AwsMskFailureReason$json = { + '1': 'AwsMskFailureReason', + '2': [ + {'1': 'cluster_arn', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'clusterArn'}, + {'1': 'kafka_topic', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'kafkaTopic'}, + {'1': 'partition_id', '3': 3, '4': 1, '5': 3, '8': {}, '10': 'partitionId'}, + {'1': 'offset', '3': 4, '4': 1, '5': 3, '8': {}, '10': 'offset'}, + { + '1': 'api_violation_reason', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', + '8': {}, + '9': 0, + '10': 'apiViolationReason' + }, + { + '1': 'schema_violation_reason', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', + '8': {}, + '9': 0, + '10': 'schemaViolationReason' + }, + { + '1': 'message_transformation_failure_reason', + '3': 7, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', + '8': {}, + '9': 0, + '10': 'messageTransformationFailureReason' + }, + ], + '8': [ + {'1': 'reason'}, + ], +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_AzureEventHubsFailureReason$json = { + '1': 'AzureEventHubsFailureReason', + '2': [ + {'1': 'namespace', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'namespace'}, + {'1': 'event_hub', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'eventHub'}, + {'1': 'partition_id', '3': 3, '4': 1, '5': 3, '8': {}, '10': 'partitionId'}, + {'1': 'offset', '3': 4, '4': 1, '5': 3, '8': {}, '10': 'offset'}, + { + '1': 'api_violation_reason', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', + '8': {}, + '9': 0, + '10': 'apiViolationReason' + }, + { + '1': 'schema_violation_reason', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', + '8': {}, + '9': 0, + '10': 'schemaViolationReason' + }, + { + '1': 'message_transformation_failure_reason', + '3': 7, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', + '8': {}, + '9': 0, + '10': 'messageTransformationFailureReason' + }, + ], + '8': [ + {'1': 'reason'}, + ], +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_ConfluentCloudFailureReason$json = { + '1': 'ConfluentCloudFailureReason', + '2': [ + {'1': 'cluster_id', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'clusterId'}, + {'1': 'kafka_topic', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'kafkaTopic'}, + {'1': 'partition_id', '3': 3, '4': 1, '5': 3, '8': {}, '10': 'partitionId'}, + {'1': 'offset', '3': 4, '4': 1, '5': 3, '8': {}, '10': 'offset'}, + { + '1': 'api_violation_reason', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', + '8': {}, + '9': 0, + '10': 'apiViolationReason' + }, + { + '1': 'schema_violation_reason', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', + '8': {}, + '9': 0, + '10': 'schemaViolationReason' + }, + { + '1': 'message_transformation_failure_reason', + '3': 7, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', + '8': {}, + '9': 0, + '10': 'messageTransformationFailureReason' + }, + ], + '8': [ + {'1': 'reason'}, + ], +}; + +@$core.Deprecated('Use ingestionFailureEventDescriptor instead') +const IngestionFailureEvent_AwsKinesisFailureReason$json = { + '1': 'AwsKinesisFailureReason', + '2': [ + {'1': 'stream_arn', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'streamArn'}, + { + '1': 'partition_key', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'partitionKey' + }, + { + '1': 'sequence_number', + '3': 3, + '4': 1, + '5': 9, + '8': {}, + '10': 'sequenceNumber' + }, + { + '1': 'schema_violation_reason', + '3': 4, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', + '8': {}, + '9': 0, + '10': 'schemaViolationReason' + }, + { + '1': 'message_transformation_failure_reason', + '3': 5, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', + '8': {}, + '9': 0, + '10': 'messageTransformationFailureReason' + }, + { + '1': 'api_violation_reason', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', + '8': {}, + '9': 0, + '10': 'apiViolationReason' + }, + ], + '8': [ + {'1': 'reason'}, + ], +}; + +/// Descriptor for `IngestionFailureEvent`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List ingestionFailureEventDescriptor = $convert.base64Decode( + 'ChVJbmdlc3Rpb25GYWlsdXJlRXZlbnQSOQoFdG9waWMYASABKAlCI+BBAvpBHQobcHVic3ViLm' + 'dvb2dsZWFwaXMuY29tL1RvcGljUgV0b3BpYxIoCg1lcnJvcl9tZXNzYWdlGAIgASgJQgPgQQJS' + 'DGVycm9yTWVzc2FnZRJ2ChVjbG91ZF9zdG9yYWdlX2ZhaWx1cmUYAyABKAsyOy5nb29nbGUucH' + 'Vic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5DbG91ZFN0b3JhZ2VGYWlsdXJlQgPgQQFI' + 'AFITY2xvdWRTdG9yYWdlRmFpbHVyZRJqCg9hd3NfbXNrX2ZhaWx1cmUYBCABKAsyOy5nb29nbG' + 'UucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5Bd3NNc2tGYWlsdXJlUmVhc29uQgPg' + 'QQFIAFINYXdzTXNrRmFpbHVyZRKDAQoYYXp1cmVfZXZlbnRfaHVic19mYWlsdXJlGAUgASgLMk' + 'MuZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuQXp1cmVFdmVudEh1YnNG' + 'YWlsdXJlUmVhc29uQgPgQQFIAFIVYXp1cmVFdmVudEh1YnNGYWlsdXJlEoIBChdjb25mbHVlbn' + 'RfY2xvdWRfZmFpbHVyZRgGIAEoCzJDLmdvb2dsZS5wdWJzdWIudjEuSW5nZXN0aW9uRmFpbHVy' + 'ZUV2ZW50LkNvbmZsdWVudENsb3VkRmFpbHVyZVJlYXNvbkID4EEBSABSFWNvbmZsdWVudENsb3' + 'VkRmFpbHVyZRJ2ChNhd3Nfa2luZXNpc19mYWlsdXJlGAcgASgLMj8uZ29vZ2xlLnB1YnN1Yi52' + 'MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuQXdzS2luZXNpc0ZhaWx1cmVSZWFzb25CA+BBAUgAUh' + 'Fhd3NLaW5lc2lzRmFpbHVyZRoUChJBcGlWaW9sYXRpb25SZWFzb24aEwoRQXZyb0ZhaWx1cmVS' + 'ZWFzb24aFwoVU2NoZW1hVmlvbGF0aW9uUmVhc29uGiQKIk1lc3NhZ2VUcmFuc2Zvcm1hdGlvbk' + 'ZhaWx1cmVSZWFzb24aoAUKE0Nsb3VkU3RvcmFnZUZhaWx1cmUSGwoGYnVja2V0GAEgASgJQgPg' + 'QQFSBmJ1Y2tldBIkCgtvYmplY3RfbmFtZRgCIAEoCUID4EEBUgpvYmplY3ROYW1lEjAKEW9iam' + 'VjdF9nZW5lcmF0aW9uGAMgASgDQgPgQQFSEG9iamVjdEdlbmVyYXRpb24ScAoTYXZyb19mYWls' + 'dXJlX3JlYXNvbhgFIAEoCzI5Lmdvb2dsZS5wdWJzdWIudjEuSW5nZXN0aW9uRmFpbHVyZUV2ZW' + '50LkF2cm9GYWlsdXJlUmVhc29uQgPgQQFIAFIRYXZyb0ZhaWx1cmVSZWFzb24ScwoUYXBpX3Zp' + 'b2xhdGlvbl9yZWFzb24YBiABKAsyOi5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cm' + 'VFdmVudC5BcGlWaW9sYXRpb25SZWFzb25CA+BBAUgAUhJhcGlWaW9sYXRpb25SZWFzb24SfAoX' + 'c2NoZW1hX3Zpb2xhdGlvbl9yZWFzb24YByABKAsyPS5nb29nbGUucHVic3ViLnYxLkluZ2VzdG' + 'lvbkZhaWx1cmVFdmVudC5TY2hlbWFWaW9sYXRpb25SZWFzb25CA+BBAUgAUhVzY2hlbWFWaW9s' + 'YXRpb25SZWFzb24SpAEKJW1lc3NhZ2VfdHJhbnNmb3JtYXRpb25fZmFpbHVyZV9yZWFzb24YCC' + 'ABKAsySi5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5NZXNzYWdlVHJh' + 'bnNmb3JtYXRpb25GYWlsdXJlUmVhc29uQgPgQQFIAFIibWVzc2FnZVRyYW5zZm9ybWF0aW9uRm' + 'FpbHVyZVJlYXNvbkIICgZyZWFzb24aygQKE0F3c01za0ZhaWx1cmVSZWFzb24SJAoLY2x1c3Rl' + 'cl9hcm4YASABKAlCA+BBAVIKY2x1c3RlckFybhIkCgtrYWZrYV90b3BpYxgCIAEoCUID4EEBUg' + 'prYWZrYVRvcGljEiYKDHBhcnRpdGlvbl9pZBgDIAEoA0ID4EEBUgtwYXJ0aXRpb25JZBIbCgZv' + 'ZmZzZXQYBCABKANCA+BBAVIGb2Zmc2V0EnMKFGFwaV92aW9sYXRpb25fcmVhc29uGAUgASgLMj' + 'ouZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuQXBpVmlvbGF0aW9uUmVh' + 'c29uQgPgQQFIAFISYXBpVmlvbGF0aW9uUmVhc29uEnwKF3NjaGVtYV92aW9sYXRpb25fcmVhc2' + '9uGAYgASgLMj0uZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuU2NoZW1h' + 'VmlvbGF0aW9uUmVhc29uQgPgQQFIAFIVc2NoZW1hVmlvbGF0aW9uUmVhc29uEqQBCiVtZXNzYW' + 'dlX3RyYW5zZm9ybWF0aW9uX2ZhaWx1cmVfcmVhc29uGAcgASgLMkouZ29vZ2xlLnB1YnN1Yi52' + 'MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuTWVzc2FnZVRyYW5zZm9ybWF0aW9uRmFpbHVyZVJlYX' + 'NvbkID4EEBSABSIm1lc3NhZ2VUcmFuc2Zvcm1hdGlvbkZhaWx1cmVSZWFzb25CCAoGcmVhc29u' + 'GssEChtBenVyZUV2ZW50SHVic0ZhaWx1cmVSZWFzb24SIQoJbmFtZXNwYWNlGAEgASgJQgPgQQ' + 'FSCW5hbWVzcGFjZRIgCglldmVudF9odWIYAiABKAlCA+BBAVIIZXZlbnRIdWISJgoMcGFydGl0' + 'aW9uX2lkGAMgASgDQgPgQQFSC3BhcnRpdGlvbklkEhsKBm9mZnNldBgEIAEoA0ID4EEBUgZvZm' + 'ZzZXQScwoUYXBpX3Zpb2xhdGlvbl9yZWFzb24YBSABKAsyOi5nb29nbGUucHVic3ViLnYxLklu' + 'Z2VzdGlvbkZhaWx1cmVFdmVudC5BcGlWaW9sYXRpb25SZWFzb25CA+BBAUgAUhJhcGlWaW9sYX' + 'Rpb25SZWFzb24SfAoXc2NoZW1hX3Zpb2xhdGlvbl9yZWFzb24YBiABKAsyPS5nb29nbGUucHVi' + 'c3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5TY2hlbWFWaW9sYXRpb25SZWFzb25CA+BBAU' + 'gAUhVzY2hlbWFWaW9sYXRpb25SZWFzb24SpAEKJW1lc3NhZ2VfdHJhbnNmb3JtYXRpb25fZmFp' + 'bHVyZV9yZWFzb24YByABKAsySi5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdm' + 'VudC5NZXNzYWdlVHJhbnNmb3JtYXRpb25GYWlsdXJlUmVhc29uQgPgQQFIAFIibWVzc2FnZVRy' + 'YW5zZm9ybWF0aW9uRmFpbHVyZVJlYXNvbkIICgZyZWFzb24a0AQKG0NvbmZsdWVudENsb3VkRm' + 'FpbHVyZVJlYXNvbhIiCgpjbHVzdGVyX2lkGAEgASgJQgPgQQFSCWNsdXN0ZXJJZBIkCgtrYWZr' + 'YV90b3BpYxgCIAEoCUID4EEBUgprYWZrYVRvcGljEiYKDHBhcnRpdGlvbl9pZBgDIAEoA0ID4E' + 'EBUgtwYXJ0aXRpb25JZBIbCgZvZmZzZXQYBCABKANCA+BBAVIGb2Zmc2V0EnMKFGFwaV92aW9s' + 'YXRpb25fcmVhc29uGAUgASgLMjouZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRX' + 'ZlbnQuQXBpVmlvbGF0aW9uUmVhc29uQgPgQQFIAFISYXBpVmlvbGF0aW9uUmVhc29uEnwKF3Nj' + 'aGVtYV92aW9sYXRpb25fcmVhc29uGAYgASgLMj0uZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb2' + '5GYWlsdXJlRXZlbnQuU2NoZW1hVmlvbGF0aW9uUmVhc29uQgPgQQFIAFIVc2NoZW1hVmlvbGF0' + 'aW9uUmVhc29uEqQBCiVtZXNzYWdlX3RyYW5zZm9ybWF0aW9uX2ZhaWx1cmVfcmVhc29uGAcgAS' + 'gLMkouZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuTWVzc2FnZVRyYW5z' + 'Zm9ybWF0aW9uRmFpbHVyZVJlYXNvbkID4EEBSABSIm1lc3NhZ2VUcmFuc2Zvcm1hdGlvbkZhaW' + 'x1cmVSZWFzb25CCAoGcmVhc29uGrkEChdBd3NLaW5lc2lzRmFpbHVyZVJlYXNvbhIiCgpzdHJl' + 'YW1fYXJuGAEgASgJQgPgQQFSCXN0cmVhbUFybhIoCg1wYXJ0aXRpb25fa2V5GAIgASgJQgPgQQ' + 'FSDHBhcnRpdGlvbktleRIsCg9zZXF1ZW5jZV9udW1iZXIYAyABKAlCA+BBAVIOc2VxdWVuY2VO' + 'dW1iZXISfAoXc2NoZW1hX3Zpb2xhdGlvbl9yZWFzb24YBCABKAsyPS5nb29nbGUucHVic3ViLn' + 'YxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5TY2hlbWFWaW9sYXRpb25SZWFzb25CA+BBAUgAUhVz' + 'Y2hlbWFWaW9sYXRpb25SZWFzb24SpAEKJW1lc3NhZ2VfdHJhbnNmb3JtYXRpb25fZmFpbHVyZV' + '9yZWFzb24YBSABKAsySi5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5N' + 'ZXNzYWdlVHJhbnNmb3JtYXRpb25GYWlsdXJlUmVhc29uQgPgQQFIAFIibWVzc2FnZVRyYW5zZm' + '9ybWF0aW9uRmFpbHVyZVJlYXNvbhJzChRhcGlfdmlvbGF0aW9uX3JlYXNvbhgGIAEoCzI6Lmdv' + 'b2dsZS5wdWJzdWIudjEuSW5nZXN0aW9uRmFpbHVyZUV2ZW50LkFwaVZpb2xhdGlvblJlYXNvbk' + 'ID4EEBSABSEmFwaVZpb2xhdGlvblJlYXNvbkIICgZyZWFzb25CCQoHZmFpbHVyZQ=='); + +@$core.Deprecated('Use javaScriptUDFDescriptor instead') +const JavaScriptUDF$json = { + '1': 'JavaScriptUDF', + '2': [ + { + '1': 'function_name', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'functionName' + }, + {'1': 'code', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'code'}, + ], +}; + +/// Descriptor for `JavaScriptUDF`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List javaScriptUDFDescriptor = $convert.base64Decode( + 'Cg1KYXZhU2NyaXB0VURGEigKDWZ1bmN0aW9uX25hbWUYASABKAlCA+BBAlIMZnVuY3Rpb25OYW' + '1lEhcKBGNvZGUYAiABKAlCA+BBAlIEY29kZQ=='); + +@$core.Deprecated('Use aIInferenceDescriptor instead') +const AIInference$json = { + '1': 'AIInference', + '2': [ + {'1': 'endpoint', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'endpoint'}, + { + '1': 'unstructured_inference', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.AIInference.UnstructuredInference', + '8': {}, + '9': 0, + '10': 'unstructuredInference' + }, + { + '1': 'service_account_email', + '3': 3, + '4': 1, + '5': 9, + '8': {}, + '10': 'serviceAccountEmail' + }, + ], + '3': [AIInference_UnstructuredInference$json], + '8': [ + {'1': 'inference_mode'}, + ], +}; + +@$core.Deprecated('Use aIInferenceDescriptor instead') +const AIInference_UnstructuredInference$json = { + '1': 'UnstructuredInference', + '2': [ + { + '1': 'parameters', + '3': 1, + '4': 1, + '5': 11, + '6': '.google.protobuf.Struct', + '8': {}, + '10': 'parameters' + }, + ], +}; + +/// Descriptor for `AIInference`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List aIInferenceDescriptor = $convert.base64Decode( + 'CgtBSUluZmVyZW5jZRIfCghlbmRwb2ludBgBIAEoCUID4EECUghlbmRwb2ludBJxChZ1bnN0cn' + 'VjdHVyZWRfaW5mZXJlbmNlGAIgASgLMjMuZ29vZ2xlLnB1YnN1Yi52MS5BSUluZmVyZW5jZS5V' + 'bnN0cnVjdHVyZWRJbmZlcmVuY2VCA+BBAUgAUhV1bnN0cnVjdHVyZWRJbmZlcmVuY2USNwoVc2' + 'VydmljZV9hY2NvdW50X2VtYWlsGAMgASgJQgPgQQFSE3NlcnZpY2VBY2NvdW50RW1haWwaVQoV' + 'VW5zdHJ1Y3R1cmVkSW5mZXJlbmNlEjwKCnBhcmFtZXRlcnMYASABKAsyFy5nb29nbGUucHJvdG' + '9idWYuU3RydWN0QgPgQQFSCnBhcmFtZXRlcnNCEAoOaW5mZXJlbmNlX21vZGU='); + +@$core.Deprecated('Use messageTransformDescriptor instead') +const MessageTransform$json = { + '1': 'MessageTransform', + '2': [ + { + '1': 'javascript_udf', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.JavaScriptUDF', + '8': {}, + '9': 0, + '10': 'javascriptUdf' + }, + { + '1': 'ai_inference', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.AIInference', + '8': {}, + '9': 0, + '10': 'aiInference' + }, + { + '1': 'enabled', + '3': 3, + '4': 1, + '5': 8, + '8': {'3': true}, + '10': 'enabled', + }, + {'1': 'disabled', '3': 4, '4': 1, '5': 8, '8': {}, '10': 'disabled'}, + ], + '8': [ + {'1': 'transform'}, + ], +}; + +/// Descriptor for `MessageTransform`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List messageTransformDescriptor = $convert.base64Decode( + 'ChBNZXNzYWdlVHJhbnNmb3JtEk0KDmphdmFzY3JpcHRfdWRmGAIgASgLMh8uZ29vZ2xlLnB1Yn' + 'N1Yi52MS5KYXZhU2NyaXB0VURGQgPgQQFIAFINamF2YXNjcmlwdFVkZhJHCgxhaV9pbmZlcmVu' + 'Y2UYBiABKAsyHS5nb29nbGUucHVic3ViLnYxLkFJSW5mZXJlbmNlQgPgQQFIAFILYWlJbmZlcm' + 'VuY2USHwoHZW5hYmxlZBgDIAEoCEIFGAHgQQFSB2VuYWJsZWQSHwoIZGlzYWJsZWQYBCABKAhC' + 'A+BBAVIIZGlzYWJsZWRCCwoJdHJhbnNmb3Jt'); + +@$core.Deprecated('Use topicDescriptor instead') +const Topic$json = { + '1': 'Topic', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + { + '1': 'labels', + '3': 2, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Topic.LabelsEntry', + '8': {}, + '10': 'labels' + }, + { + '1': 'message_storage_policy', + '3': 3, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.MessageStoragePolicy', + '8': {}, + '10': 'messageStoragePolicy' + }, + {'1': 'kms_key_name', '3': 5, '4': 1, '5': 9, '8': {}, '10': 'kmsKeyName'}, + { + '1': 'schema_settings', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.SchemaSettings', + '8': {}, + '10': 'schemaSettings' + }, + { + '1': 'satisfies_pzs', + '3': 7, + '4': 1, + '5': 8, + '8': {}, + '10': 'satisfiesPzs' + }, + { + '1': 'message_retention_duration', + '3': 8, + '4': 1, + '5': 11, + '6': '.google.protobuf.Duration', + '8': {}, + '10': 'messageRetentionDuration' + }, + { + '1': 'state', + '3': 9, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.Topic.State', + '8': {}, + '10': 'state' + }, + { + '1': 'ingestion_data_source_settings', + '3': 10, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.IngestionDataSourceSettings', + '8': {}, + '10': 'ingestionDataSourceSettings' + }, + { + '1': 'message_transforms', + '3': 13, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.MessageTransform', + '8': {}, + '10': 'messageTransforms' + }, + { + '1': 'tags', + '3': 14, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Topic.TagsEntry', + '8': {}, + '10': 'tags' + }, + ], + '3': [Topic_LabelsEntry$json, Topic_TagsEntry$json], + '4': [Topic_State$json], + '7': {}, +}; + +@$core.Deprecated('Use topicDescriptor instead') +const Topic_LabelsEntry$json = { + '1': 'LabelsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +@$core.Deprecated('Use topicDescriptor instead') +const Topic_TagsEntry$json = { + '1': 'TagsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +@$core.Deprecated('Use topicDescriptor instead') +const Topic_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'INGESTION_RESOURCE_ERROR', '2': 2}, + ], +}; + +/// Descriptor for `Topic`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List topicDescriptor = $convert.base64Decode( + 'CgVUb3BpYxIaCgRuYW1lGAEgASgJQgbgQQLgQQhSBG5hbWUSQAoGbGFiZWxzGAIgAygLMiMuZ2' + '9vZ2xlLnB1YnN1Yi52MS5Ub3BpYy5MYWJlbHNFbnRyeUID4EEBUgZsYWJlbHMSYQoWbWVzc2Fn' + 'ZV9zdG9yYWdlX3BvbGljeRgDIAEoCzImLmdvb2dsZS5wdWJzdWIudjEuTWVzc2FnZVN0b3JhZ2' + 'VQb2xpY3lCA+BBAVIUbWVzc2FnZVN0b3JhZ2VQb2xpY3kSSwoMa21zX2tleV9uYW1lGAUgASgJ' + 'QingQQH6QSMKIWNsb3Vka21zLmdvb2dsZWFwaXMuY29tL0NyeXB0b0tleVIKa21zS2V5TmFtZR' + 'JOCg9zY2hlbWFfc2V0dGluZ3MYBiABKAsyIC5nb29nbGUucHVic3ViLnYxLlNjaGVtYVNldHRp' + 'bmdzQgPgQQFSDnNjaGVtYVNldHRpbmdzEigKDXNhdGlzZmllc19wenMYByABKAhCA+BBAVIMc2' + 'F0aXNmaWVzUHpzElwKGm1lc3NhZ2VfcmV0ZW50aW9uX2R1cmF0aW9uGAggASgLMhkuZ29vZ2xl' + 'LnByb3RvYnVmLkR1cmF0aW9uQgPgQQFSGG1lc3NhZ2VSZXRlbnRpb25EdXJhdGlvbhI4CgVzdG' + 'F0ZRgJIAEoDjIdLmdvb2dsZS5wdWJzdWIudjEuVG9waWMuU3RhdGVCA+BBA1IFc3RhdGUSdwoe' + 'aW5nZXN0aW9uX2RhdGFfc291cmNlX3NldHRpbmdzGAogASgLMi0uZ29vZ2xlLnB1YnN1Yi52MS' + '5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3NCA+BBAVIbaW5nZXN0aW9uRGF0YVNvdXJjZVNl' + 'dHRpbmdzElYKEm1lc3NhZ2VfdHJhbnNmb3JtcxgNIAMoCzIiLmdvb2dsZS5wdWJzdWIudjEuTW' + 'Vzc2FnZVRyYW5zZm9ybUID4EEBUhFtZXNzYWdlVHJhbnNmb3JtcxJACgR0YWdzGA4gAygLMiEu' + 'Z29vZ2xlLnB1YnN1Yi52MS5Ub3BpYy5UYWdzRW50cnlCCeBBBOBBBeBBAVIEdGFncxo5CgtMYW' + 'JlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGjcK' + 'CVRhZ3NFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIk' + 'gKBVN0YXRlEhUKEVNUQVRFX1VOU1BFQ0lGSUVEEAASCgoGQUNUSVZFEAESHAoYSU5HRVNUSU9O' + 'X1JFU09VUkNFX0VSUk9SEAI6Y+pBYAobcHVic3ViLmdvb2dsZWFwaXMuY29tL1RvcGljEiFwcm' + '9qZWN0cy97cHJvamVjdH0vdG9waWNzL3t0b3BpY30SD19kZWxldGVkLXRvcGljXyoGdG9waWNz' + 'MgV0b3BpYw=='); + +@$core.Deprecated('Use pubsubMessageDescriptor instead') +const PubsubMessage$json = { + '1': 'PubsubMessage', + '2': [ + {'1': 'data', '3': 1, '4': 1, '5': 12, '8': {}, '10': 'data'}, + { + '1': 'attributes', + '3': 2, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.PubsubMessage.AttributesEntry', + '8': {}, + '10': 'attributes' + }, + {'1': 'message_id', '3': 3, '4': 1, '5': 9, '10': 'messageId'}, + { + '1': 'publish_time', + '3': 4, + '4': 1, + '5': 11, + '6': '.google.protobuf.Timestamp', + '10': 'publishTime' + }, + {'1': 'ordering_key', '3': 5, '4': 1, '5': 9, '8': {}, '10': 'orderingKey'}, + ], + '3': [PubsubMessage_AttributesEntry$json], +}; + +@$core.Deprecated('Use pubsubMessageDescriptor instead') +const PubsubMessage_AttributesEntry$json = { + '1': 'AttributesEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +/// Descriptor for `PubsubMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List pubsubMessageDescriptor = $convert.base64Decode( + 'Cg1QdWJzdWJNZXNzYWdlEhcKBGRhdGEYASABKAxCA+BBAVIEZGF0YRJUCgphdHRyaWJ1dGVzGA' + 'IgAygLMi8uZ29vZ2xlLnB1YnN1Yi52MS5QdWJzdWJNZXNzYWdlLkF0dHJpYnV0ZXNFbnRyeUID' + '4EEBUgphdHRyaWJ1dGVzEh0KCm1lc3NhZ2VfaWQYAyABKAlSCW1lc3NhZ2VJZBI9CgxwdWJsaX' + 'NoX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgtwdWJsaXNoVGltZRIm' + 'CgxvcmRlcmluZ19rZXkYBSABKAlCA+BBAVILb3JkZXJpbmdLZXkaPQoPQXR0cmlidXRlc0VudH' + 'J5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE='); + +@$core.Deprecated('Use getTopicRequestDescriptor instead') +const GetTopicRequest$json = { + '1': 'GetTopicRequest', + '2': [ + {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + ], +}; + +/// Descriptor for `GetTopicRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getTopicRequestDescriptor = $convert.base64Decode( + 'Cg9HZXRUb3BpY1JlcXVlc3QSOQoFdG9waWMYASABKAlCI+BBAvpBHQobcHVic3ViLmdvb2dsZW' + 'FwaXMuY29tL1RvcGljUgV0b3BpYw=='); + +@$core.Deprecated('Use updateTopicRequestDescriptor instead') +const UpdateTopicRequest$json = { + '1': 'UpdateTopicRequest', + '2': [ + { + '1': 'topic', + '3': 1, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.Topic', + '8': {}, + '10': 'topic' + }, + { + '1': 'update_mask', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.protobuf.FieldMask', + '8': {}, + '10': 'updateMask' + }, + ], +}; + +/// Descriptor for `UpdateTopicRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List updateTopicRequestDescriptor = $convert.base64Decode( + 'ChJVcGRhdGVUb3BpY1JlcXVlc3QSMgoFdG9waWMYASABKAsyFy5nb29nbGUucHVic3ViLnYxLl' + 'RvcGljQgPgQQJSBXRvcGljEkAKC3VwZGF0ZV9tYXNrGAIgASgLMhouZ29vZ2xlLnByb3RvYnVm' + 'LkZpZWxkTWFza0ID4EECUgp1cGRhdGVNYXNr'); + +@$core.Deprecated('Use publishRequestDescriptor instead') +const PublishRequest$json = { + '1': 'PublishRequest', + '2': [ + {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + { + '1': 'messages', + '3': 2, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.PubsubMessage', + '8': {}, + '10': 'messages' + }, + ], +}; + +/// Descriptor for `PublishRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List publishRequestDescriptor = $convert.base64Decode( + 'Cg5QdWJsaXNoUmVxdWVzdBI5CgV0b3BpYxgBIAEoCUIj4EEC+kEdChtwdWJzdWIuZ29vZ2xlYX' + 'Bpcy5jb20vVG9waWNSBXRvcGljEkAKCG1lc3NhZ2VzGAIgAygLMh8uZ29vZ2xlLnB1YnN1Yi52' + 'MS5QdWJzdWJNZXNzYWdlQgPgQQJSCG1lc3NhZ2Vz'); + +@$core.Deprecated('Use publishResponseDescriptor instead') +const PublishResponse$json = { + '1': 'PublishResponse', + '2': [ + {'1': 'message_ids', '3': 1, '4': 3, '5': 9, '8': {}, '10': 'messageIds'}, + ], +}; + +/// Descriptor for `PublishResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List publishResponseDescriptor = $convert.base64Decode( + 'Cg9QdWJsaXNoUmVzcG9uc2USJAoLbWVzc2FnZV9pZHMYASADKAlCA+BBAVIKbWVzc2FnZUlkcw' + '=='); + +@$core.Deprecated('Use listTopicsRequestDescriptor instead') +const ListTopicsRequest$json = { + '1': 'ListTopicsRequest', + '2': [ + {'1': 'project', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'project'}, + {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, + {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, + ], +}; + +/// Descriptor for `ListTopicsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listTopicsRequestDescriptor = $convert.base64Decode( + 'ChFMaXN0VG9waWNzUmVxdWVzdBJNCgdwcm9qZWN0GAEgASgJQjPgQQL6QS0KK2Nsb3VkcmVzb3' + 'VyY2VtYW5hZ2VyLmdvb2dsZWFwaXMuY29tL1Byb2plY3RSB3Byb2plY3QSIAoJcGFnZV9zaXpl' + 'GAIgASgFQgPgQQFSCHBhZ2VTaXplEiIKCnBhZ2VfdG9rZW4YAyABKAlCA+BBAVIJcGFnZVRva2' + 'Vu'); + +@$core.Deprecated('Use listTopicsResponseDescriptor instead') +const ListTopicsResponse$json = { + '1': 'ListTopicsResponse', + '2': [ + { + '1': 'topics', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Topic', + '8': {}, + '10': 'topics' + }, + { + '1': 'next_page_token', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'nextPageToken' + }, + ], +}; + +/// Descriptor for `ListTopicsResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listTopicsResponseDescriptor = $convert.base64Decode( + 'ChJMaXN0VG9waWNzUmVzcG9uc2USNAoGdG9waWNzGAEgAygLMhcuZ29vZ2xlLnB1YnN1Yi52MS' + '5Ub3BpY0ID4EEBUgZ0b3BpY3MSKwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJQgPgQQFSDW5leHRQ' + 'YWdlVG9rZW4='); + +@$core.Deprecated('Use listTopicSubscriptionsRequestDescriptor instead') +const ListTopicSubscriptionsRequest$json = { + '1': 'ListTopicSubscriptionsRequest', + '2': [ + {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, + {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, + ], +}; + +/// Descriptor for `ListTopicSubscriptionsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listTopicSubscriptionsRequestDescriptor = + $convert.base64Decode( + 'Ch1MaXN0VG9waWNTdWJzY3JpcHRpb25zUmVxdWVzdBI5CgV0b3BpYxgBIAEoCUIj4EEC+kEdCh' + 'twdWJzdWIuZ29vZ2xlYXBpcy5jb20vVG9waWNSBXRvcGljEiAKCXBhZ2Vfc2l6ZRgCIAEoBUID' + '4EEBUghwYWdlU2l6ZRIiCgpwYWdlX3Rva2VuGAMgASgJQgPgQQFSCXBhZ2VUb2tlbg=='); + +@$core.Deprecated('Use listTopicSubscriptionsResponseDescriptor instead') +const ListTopicSubscriptionsResponse$json = { + '1': 'ListTopicSubscriptionsResponse', + '2': [ + { + '1': 'subscriptions', + '3': 1, + '4': 3, + '5': 9, + '8': {}, + '10': 'subscriptions' + }, + { + '1': 'next_page_token', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'nextPageToken' + }, + ], +}; + +/// Descriptor for `ListTopicSubscriptionsResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listTopicSubscriptionsResponseDescriptor = + $convert.base64Decode( + 'Ch5MaXN0VG9waWNTdWJzY3JpcHRpb25zUmVzcG9uc2USUAoNc3Vic2NyaXB0aW9ucxgBIAMoCU' + 'Iq4EEB+kEkCiJwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU3Vic2NyaXB0aW9uUg1zdWJzY3JpcHRp' + 'b25zEisKD25leHRfcGFnZV90b2tlbhgCIAEoCUID4EEBUg1uZXh0UGFnZVRva2Vu'); + +@$core.Deprecated('Use listTopicSnapshotsRequestDescriptor instead') +const ListTopicSnapshotsRequest$json = { + '1': 'ListTopicSnapshotsRequest', + '2': [ + {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, + {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, + ], +}; + +/// Descriptor for `ListTopicSnapshotsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listTopicSnapshotsRequestDescriptor = $convert.base64Decode( + 'ChlMaXN0VG9waWNTbmFwc2hvdHNSZXF1ZXN0EjkKBXRvcGljGAEgASgJQiPgQQL6QR0KG3B1Yn' + 'N1Yi5nb29nbGVhcGlzLmNvbS9Ub3BpY1IFdG9waWMSIAoJcGFnZV9zaXplGAIgASgFQgPgQQFS' + 'CHBhZ2VTaXplEiIKCnBhZ2VfdG9rZW4YAyABKAlCA+BBAVIJcGFnZVRva2Vu'); + +@$core.Deprecated('Use listTopicSnapshotsResponseDescriptor instead') +const ListTopicSnapshotsResponse$json = { + '1': 'ListTopicSnapshotsResponse', + '2': [ + {'1': 'snapshots', '3': 1, '4': 3, '5': 9, '8': {}, '10': 'snapshots'}, + { + '1': 'next_page_token', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'nextPageToken' + }, + ], +}; + +/// Descriptor for `ListTopicSnapshotsResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listTopicSnapshotsResponseDescriptor = + $convert.base64Decode( + 'ChpMaXN0VG9waWNTbmFwc2hvdHNSZXNwb25zZRJECglzbmFwc2hvdHMYASADKAlCJuBBAfpBIA' + 'oecHVic3ViLmdvb2dsZWFwaXMuY29tL1NuYXBzaG90UglzbmFwc2hvdHMSKwoPbmV4dF9wYWdl' + 'X3Rva2VuGAIgASgJQgPgQQFSDW5leHRQYWdlVG9rZW4='); + +@$core.Deprecated('Use deleteTopicRequestDescriptor instead') +const DeleteTopicRequest$json = { + '1': 'DeleteTopicRequest', + '2': [ + {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + ], +}; + +/// Descriptor for `DeleteTopicRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List deleteTopicRequestDescriptor = $convert.base64Decode( + 'ChJEZWxldGVUb3BpY1JlcXVlc3QSOQoFdG9waWMYASABKAlCI+BBAvpBHQobcHVic3ViLmdvb2' + 'dsZWFwaXMuY29tL1RvcGljUgV0b3BpYw=='); + +@$core.Deprecated('Use detachSubscriptionRequestDescriptor instead') +const DetachSubscriptionRequest$json = { + '1': 'DetachSubscriptionRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + ], +}; + +/// Descriptor for `DetachSubscriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List detachSubscriptionRequestDescriptor = + $convert.base64Decode( + 'ChlEZXRhY2hTdWJzY3JpcHRpb25SZXF1ZXN0Ek4KDHN1YnNjcmlwdGlvbhgBIAEoCUIq4EEC+k' + 'EkCiJwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU3Vic2NyaXB0aW9uUgxzdWJzY3JpcHRpb24='); + +@$core.Deprecated('Use detachSubscriptionResponseDescriptor instead') +const DetachSubscriptionResponse$json = { + '1': 'DetachSubscriptionResponse', +}; + +/// Descriptor for `DetachSubscriptionResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List detachSubscriptionResponseDescriptor = + $convert.base64Decode('ChpEZXRhY2hTdWJzY3JpcHRpb25SZXNwb25zZQ=='); + +@$core.Deprecated('Use subscriptionDescriptor instead') +const Subscription$json = { + '1': 'Subscription', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + {'1': 'topic', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + { + '1': 'push_config', + '3': 4, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.PushConfig', + '8': {}, + '10': 'pushConfig' + }, + { + '1': 'bigquery_config', + '3': 18, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.BigQueryConfig', + '8': {}, + '10': 'bigqueryConfig' + }, + { + '1': 'cloud_storage_config', + '3': 22, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.CloudStorageConfig', + '8': {}, + '10': 'cloudStorageConfig' + }, + { + '1': 'bigtable_config', + '3': 27, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.BigtableConfig', + '8': {}, + '10': 'bigtableConfig' + }, + { + '1': 'ack_deadline_seconds', + '3': 5, + '4': 1, + '5': 5, + '8': {}, + '10': 'ackDeadlineSeconds' + }, + { + '1': 'retain_acked_messages', + '3': 7, + '4': 1, + '5': 8, + '8': {}, + '10': 'retainAckedMessages' + }, + { + '1': 'message_retention_duration', + '3': 8, + '4': 1, + '5': 11, + '6': '.google.protobuf.Duration', + '8': {}, + '10': 'messageRetentionDuration' + }, + { + '1': 'labels', + '3': 9, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Subscription.LabelsEntry', + '8': {}, + '10': 'labels' + }, + { + '1': 'enable_message_ordering', + '3': 10, + '4': 1, + '5': 8, + '8': {}, + '10': 'enableMessageOrdering' + }, + { + '1': 'expiration_policy', + '3': 11, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.ExpirationPolicy', + '8': {}, + '10': 'expirationPolicy' + }, + {'1': 'filter', '3': 12, '4': 1, '5': 9, '8': {}, '10': 'filter'}, + { + '1': 'dead_letter_policy', + '3': 13, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.DeadLetterPolicy', + '8': {}, + '10': 'deadLetterPolicy' + }, + { + '1': 'retry_policy', + '3': 14, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.RetryPolicy', + '8': {}, + '10': 'retryPolicy' + }, + {'1': 'detached', '3': 15, '4': 1, '5': 8, '8': {}, '10': 'detached'}, + { + '1': 'enable_exactly_once_delivery', + '3': 16, + '4': 1, + '5': 8, + '8': {}, + '10': 'enableExactlyOnceDelivery' + }, + { + '1': 'topic_message_retention_duration', + '3': 17, + '4': 1, + '5': 11, + '6': '.google.protobuf.Duration', + '8': {}, + '10': 'topicMessageRetentionDuration' + }, + { + '1': 'state', + '3': 19, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.Subscription.State', + '8': {}, + '10': 'state' + }, + { + '1': 'analytics_hub_subscription_info', + '3': 23, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.Subscription.AnalyticsHubSubscriptionInfo', + '8': {}, + '10': 'analyticsHubSubscriptionInfo' + }, + { + '1': 'message_transforms', + '3': 25, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.MessageTransform', + '8': {}, + '10': 'messageTransforms' + }, + { + '1': 'tags', + '3': 26, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Subscription.TagsEntry', + '8': {}, + '10': 'tags' + }, + ], + '3': [ + Subscription_AnalyticsHubSubscriptionInfo$json, + Subscription_LabelsEntry$json, + Subscription_TagsEntry$json + ], + '4': [Subscription_State$json], + '7': {}, +}; + +@$core.Deprecated('Use subscriptionDescriptor instead') +const Subscription_AnalyticsHubSubscriptionInfo$json = { + '1': 'AnalyticsHubSubscriptionInfo', + '2': [ + {'1': 'listing', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'listing'}, + { + '1': 'subscription', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + ], +}; + +@$core.Deprecated('Use subscriptionDescriptor instead') +const Subscription_LabelsEntry$json = { + '1': 'LabelsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +@$core.Deprecated('Use subscriptionDescriptor instead') +const Subscription_TagsEntry$json = { + '1': 'TagsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +@$core.Deprecated('Use subscriptionDescriptor instead') +const Subscription_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'RESOURCE_ERROR', '2': 2}, + ], +}; + +/// Descriptor for `Subscription`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List subscriptionDescriptor = $convert.base64Decode( + 'CgxTdWJzY3JpcHRpb24SGgoEbmFtZRgBIAEoCUIG4EEC4EEIUgRuYW1lEjkKBXRvcGljGAIgAS' + 'gJQiPgQQL6QR0KG3B1YnN1Yi5nb29nbGVhcGlzLmNvbS9Ub3BpY1IFdG9waWMSQgoLcHVzaF9j' + 'b25maWcYBCABKAsyHC5nb29nbGUucHVic3ViLnYxLlB1c2hDb25maWdCA+BBAVIKcHVzaENvbm' + 'ZpZxJOCg9iaWdxdWVyeV9jb25maWcYEiABKAsyIC5nb29nbGUucHVic3ViLnYxLkJpZ1F1ZXJ5' + 'Q29uZmlnQgPgQQFSDmJpZ3F1ZXJ5Q29uZmlnElsKFGNsb3VkX3N0b3JhZ2VfY29uZmlnGBYgAS' + 'gLMiQuZ29vZ2xlLnB1YnN1Yi52MS5DbG91ZFN0b3JhZ2VDb25maWdCA+BBAVISY2xvdWRTdG9y' + 'YWdlQ29uZmlnEk4KD2JpZ3RhYmxlX2NvbmZpZxgbIAEoCzIgLmdvb2dsZS5wdWJzdWIudjEuQm' + 'lndGFibGVDb25maWdCA+BBAVIOYmlndGFibGVDb25maWcSNQoUYWNrX2RlYWRsaW5lX3NlY29u' + 'ZHMYBSABKAVCA+BBAVISYWNrRGVhZGxpbmVTZWNvbmRzEjcKFXJldGFpbl9hY2tlZF9tZXNzYW' + 'dlcxgHIAEoCEID4EEBUhNyZXRhaW5BY2tlZE1lc3NhZ2VzElwKGm1lc3NhZ2VfcmV0ZW50aW9u' + 'X2R1cmF0aW9uGAggASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQgPgQQFSGG1lc3NhZ2' + 'VSZXRlbnRpb25EdXJhdGlvbhJHCgZsYWJlbHMYCSADKAsyKi5nb29nbGUucHVic3ViLnYxLlN1' + 'YnNjcmlwdGlvbi5MYWJlbHNFbnRyeUID4EEBUgZsYWJlbHMSOwoXZW5hYmxlX21lc3NhZ2Vfb3' + 'JkZXJpbmcYCiABKAhCA+BBAVIVZW5hYmxlTWVzc2FnZU9yZGVyaW5nElQKEWV4cGlyYXRpb25f' + 'cG9saWN5GAsgASgLMiIuZ29vZ2xlLnB1YnN1Yi52MS5FeHBpcmF0aW9uUG9saWN5QgPgQQFSEG' + 'V4cGlyYXRpb25Qb2xpY3kSGwoGZmlsdGVyGAwgASgJQgPgQQFSBmZpbHRlchJVChJkZWFkX2xl' + 'dHRlcl9wb2xpY3kYDSABKAsyIi5nb29nbGUucHVic3ViLnYxLkRlYWRMZXR0ZXJQb2xpY3lCA+' + 'BBAVIQZGVhZExldHRlclBvbGljeRJFCgxyZXRyeV9wb2xpY3kYDiABKAsyHS5nb29nbGUucHVi' + 'c3ViLnYxLlJldHJ5UG9saWN5QgPgQQFSC3JldHJ5UG9saWN5Eh8KCGRldGFjaGVkGA8gASgIQg' + 'PgQQFSCGRldGFjaGVkEkQKHGVuYWJsZV9leGFjdGx5X29uY2VfZGVsaXZlcnkYECABKAhCA+BB' + 'AVIZZW5hYmxlRXhhY3RseU9uY2VEZWxpdmVyeRJnCiB0b3BpY19tZXNzYWdlX3JldGVudGlvbl' + '9kdXJhdGlvbhgRIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkID4EEDUh10b3BpY01l' + 'c3NhZ2VSZXRlbnRpb25EdXJhdGlvbhI/CgVzdGF0ZRgTIAEoDjIkLmdvb2dsZS5wdWJzdWIudj' + 'EuU3Vic2NyaXB0aW9uLlN0YXRlQgPgQQNSBXN0YXRlEocBCh9hbmFseXRpY3NfaHViX3N1YnNj' + 'cmlwdGlvbl9pbmZvGBcgASgLMjsuZ29vZ2xlLnB1YnN1Yi52MS5TdWJzY3JpcHRpb24uQW5hbH' + 'l0aWNzSHViU3Vic2NyaXB0aW9uSW5mb0ID4EEDUhxhbmFseXRpY3NIdWJTdWJzY3JpcHRpb25J' + 'bmZvElYKEm1lc3NhZ2VfdHJhbnNmb3JtcxgZIAMoCzIiLmdvb2dsZS5wdWJzdWIudjEuTWVzc2' + 'FnZVRyYW5zZm9ybUID4EEBUhFtZXNzYWdlVHJhbnNmb3JtcxJHCgR0YWdzGBogAygLMiguZ29v' + 'Z2xlLnB1YnN1Yi52MS5TdWJzY3JpcHRpb24uVGFnc0VudHJ5QgngQQTgQQXgQQFSBHRhZ3Majg' + 'EKHEFuYWx5dGljc0h1YlN1YnNjcmlwdGlvbkluZm8SRQoHbGlzdGluZxgBIAEoCUIr4EEB+kEl' + 'CiNhbmFseXRpY3NodWIuZ29vZ2xlYXBpcy5jb20vTGlzdGluZ1IHbGlzdGluZxInCgxzdWJzY3' + 'JpcHRpb24YAiABKAlCA+BBAVIMc3Vic2NyaXB0aW9uGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgB' + 'IAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaNwoJVGFnc0VudHJ5EhAKA2tleR' + 'gBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiPgoFU3RhdGUSFQoRU1RBVEVf' + 'VU5TUEVDSUZJRUQQABIKCgZBQ1RJVkUQARISCg5SRVNPVVJDRV9FUlJPUhACOnXqQXIKInB1Yn' + 'N1Yi5nb29nbGVhcGlzLmNvbS9TdWJzY3JpcHRpb24SL3Byb2plY3RzL3twcm9qZWN0fS9zdWJz' + 'Y3JpcHRpb25zL3tzdWJzY3JpcHRpb259Kg1zdWJzY3JpcHRpb25zMgxzdWJzY3JpcHRpb24='); + +@$core.Deprecated('Use retryPolicyDescriptor instead') +const RetryPolicy$json = { + '1': 'RetryPolicy', + '2': [ + { + '1': 'minimum_backoff', + '3': 1, + '4': 1, + '5': 11, + '6': '.google.protobuf.Duration', + '8': {}, + '10': 'minimumBackoff' + }, + { + '1': 'maximum_backoff', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.protobuf.Duration', + '8': {}, + '10': 'maximumBackoff' + }, + ], +}; + +/// Descriptor for `RetryPolicy`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List retryPolicyDescriptor = $convert.base64Decode( + 'CgtSZXRyeVBvbGljeRJHCg9taW5pbXVtX2JhY2tvZmYYASABKAsyGS5nb29nbGUucHJvdG9idW' + 'YuRHVyYXRpb25CA+BBAVIObWluaW11bUJhY2tvZmYSRwoPbWF4aW11bV9iYWNrb2ZmGAIgASgL' + 'MhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQgPgQQFSDm1heGltdW1CYWNrb2Zm'); + +@$core.Deprecated('Use deadLetterPolicyDescriptor instead') +const DeadLetterPolicy$json = { + '1': 'DeadLetterPolicy', + '2': [ + { + '1': 'dead_letter_topic', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'deadLetterTopic' + }, + { + '1': 'max_delivery_attempts', + '3': 2, + '4': 1, + '5': 5, + '8': {}, + '10': 'maxDeliveryAttempts' + }, + ], +}; + +/// Descriptor for `DeadLetterPolicy`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List deadLetterPolicyDescriptor = $convert.base64Decode( + 'ChBEZWFkTGV0dGVyUG9saWN5Ek8KEWRlYWRfbGV0dGVyX3RvcGljGAEgASgJQiPgQQH6QR0KG3' + 'B1YnN1Yi5nb29nbGVhcGlzLmNvbS9Ub3BpY1IPZGVhZExldHRlclRvcGljEjcKFW1heF9kZWxp' + 'dmVyeV9hdHRlbXB0cxgCIAEoBUID4EEBUhNtYXhEZWxpdmVyeUF0dGVtcHRz'); + +@$core.Deprecated('Use expirationPolicyDescriptor instead') +const ExpirationPolicy$json = { + '1': 'ExpirationPolicy', + '2': [ + { + '1': 'ttl', + '3': 1, + '4': 1, + '5': 11, + '6': '.google.protobuf.Duration', + '8': {}, + '10': 'ttl' + }, + ], +}; + +/// Descriptor for `ExpirationPolicy`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List expirationPolicyDescriptor = $convert.base64Decode( + 'ChBFeHBpcmF0aW9uUG9saWN5EjAKA3R0bBgBIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdG' + 'lvbkID4EEBUgN0dGw='); + +@$core.Deprecated('Use pushConfigDescriptor instead') +const PushConfig$json = { + '1': 'PushConfig', + '2': [ + { + '1': 'push_endpoint', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'pushEndpoint' + }, + { + '1': 'attributes', + '3': 2, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.PushConfig.AttributesEntry', + '8': {}, + '10': 'attributes' + }, + { + '1': 'oidc_token', + '3': 3, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.PushConfig.OidcToken', + '8': {}, + '9': 0, + '10': 'oidcToken' + }, + { + '1': 'pubsub_wrapper', + '3': 4, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.PushConfig.PubsubWrapper', + '8': {}, + '9': 1, + '10': 'pubsubWrapper' + }, + { + '1': 'no_wrapper', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.PushConfig.NoWrapper', + '8': {}, + '9': 1, + '10': 'noWrapper' + }, + ], + '3': [ + PushConfig_OidcToken$json, + PushConfig_PubsubWrapper$json, + PushConfig_NoWrapper$json, + PushConfig_AttributesEntry$json + ], + '8': [ + {'1': 'authentication_method'}, + {'1': 'wrapper'}, + ], +}; + +@$core.Deprecated('Use pushConfigDescriptor instead') +const PushConfig_OidcToken$json = { + '1': 'OidcToken', + '2': [ + { + '1': 'service_account_email', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'serviceAccountEmail' + }, + {'1': 'audience', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'audience'}, + ], +}; + +@$core.Deprecated('Use pushConfigDescriptor instead') +const PushConfig_PubsubWrapper$json = { + '1': 'PubsubWrapper', +}; + +@$core.Deprecated('Use pushConfigDescriptor instead') +const PushConfig_NoWrapper$json = { + '1': 'NoWrapper', + '2': [ + { + '1': 'write_metadata', + '3': 1, + '4': 1, + '5': 8, + '8': {}, + '10': 'writeMetadata' + }, + ], +}; + +@$core.Deprecated('Use pushConfigDescriptor instead') +const PushConfig_AttributesEntry$json = { + '1': 'AttributesEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +/// Descriptor for `PushConfig`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List pushConfigDescriptor = $convert.base64Decode( + 'CgpQdXNoQ29uZmlnEigKDXB1c2hfZW5kcG9pbnQYASABKAlCA+BBAVIMcHVzaEVuZHBvaW50El' + 'EKCmF0dHJpYnV0ZXMYAiADKAsyLC5nb29nbGUucHVic3ViLnYxLlB1c2hDb25maWcuQXR0cmli' + 'dXRlc0VudHJ5QgPgQQFSCmF0dHJpYnV0ZXMSTAoKb2lkY190b2tlbhgDIAEoCzImLmdvb2dsZS' + '5wdWJzdWIudjEuUHVzaENvbmZpZy5PaWRjVG9rZW5CA+BBAUgAUglvaWRjVG9rZW4SWAoOcHVi' + 'c3ViX3dyYXBwZXIYBCABKAsyKi5nb29nbGUucHVic3ViLnYxLlB1c2hDb25maWcuUHVic3ViV3' + 'JhcHBlckID4EEBSAFSDXB1YnN1YldyYXBwZXISTAoKbm9fd3JhcHBlchgFIAEoCzImLmdvb2ds' + 'ZS5wdWJzdWIudjEuUHVzaENvbmZpZy5Ob1dyYXBwZXJCA+BBAUgBUglub1dyYXBwZXIaZQoJT2' + 'lkY1Rva2VuEjcKFXNlcnZpY2VfYWNjb3VudF9lbWFpbBgBIAEoCUID4EEBUhNzZXJ2aWNlQWNj' + 'b3VudEVtYWlsEh8KCGF1ZGllbmNlGAIgASgJQgPgQQFSCGF1ZGllbmNlGg8KDVB1YnN1YldyYX' + 'BwZXIaNwoJTm9XcmFwcGVyEioKDndyaXRlX21ldGFkYXRhGAEgASgIQgPgQQFSDXdyaXRlTWV0' + 'YWRhdGEaPQoPQXR0cmlidXRlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgAS' + 'gJUgV2YWx1ZToCOAFCFwoVYXV0aGVudGljYXRpb25fbWV0aG9kQgkKB3dyYXBwZXI='); + +@$core.Deprecated('Use bigQueryConfigDescriptor instead') +const BigQueryConfig$json = { + '1': 'BigQueryConfig', + '2': [ + {'1': 'table', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'table'}, + { + '1': 'use_topic_schema', + '3': 2, + '4': 1, + '5': 8, + '8': {}, + '10': 'useTopicSchema' + }, + { + '1': 'write_metadata', + '3': 3, + '4': 1, + '5': 8, + '8': {}, + '10': 'writeMetadata' + }, + { + '1': 'drop_unknown_fields', + '3': 4, + '4': 1, + '5': 8, + '8': {}, + '10': 'dropUnknownFields' + }, + { + '1': 'state', + '3': 5, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.BigQueryConfig.State', + '8': {}, + '10': 'state' + }, + { + '1': 'use_table_schema', + '3': 6, + '4': 1, + '5': 8, + '8': {}, + '10': 'useTableSchema' + }, + { + '1': 'service_account_email', + '3': 7, + '4': 1, + '5': 9, + '8': {}, + '10': 'serviceAccountEmail' + }, + ], + '4': [BigQueryConfig_State$json], +}; + +@$core.Deprecated('Use bigQueryConfigDescriptor instead') +const BigQueryConfig_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'PERMISSION_DENIED', '2': 2}, + {'1': 'NOT_FOUND', '2': 3}, + {'1': 'SCHEMA_MISMATCH', '2': 4}, + {'1': 'IN_TRANSIT_LOCATION_RESTRICTION', '2': 5}, + {'1': 'VERTEX_AI_LOCATION_RESTRICTION', '2': 6}, + ], +}; + +/// Descriptor for `BigQueryConfig`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List bigQueryConfigDescriptor = $convert.base64Decode( + 'Cg5CaWdRdWVyeUNvbmZpZxIZCgV0YWJsZRgBIAEoCUID4EEBUgV0YWJsZRItChB1c2VfdG9waW' + 'Nfc2NoZW1hGAIgASgIQgPgQQFSDnVzZVRvcGljU2NoZW1hEioKDndyaXRlX21ldGFkYXRhGAMg' + 'ASgIQgPgQQFSDXdyaXRlTWV0YWRhdGESMwoTZHJvcF91bmtub3duX2ZpZWxkcxgEIAEoCEID4E' + 'EBUhFkcm9wVW5rbm93bkZpZWxkcxJBCgVzdGF0ZRgFIAEoDjImLmdvb2dsZS5wdWJzdWIudjEu' + 'QmlnUXVlcnlDb25maWcuU3RhdGVCA+BBA1IFc3RhdGUSLQoQdXNlX3RhYmxlX3NjaGVtYRgGIA' + 'EoCEID4EEBUg51c2VUYWJsZVNjaGVtYRI3ChVzZXJ2aWNlX2FjY291bnRfZW1haWwYByABKAlC' + 'A+BBAVITc2VydmljZUFjY291bnRFbWFpbCKuAQoFU3RhdGUSFQoRU1RBVEVfVU5TUEVDSUZJRU' + 'QQABIKCgZBQ1RJVkUQARIVChFQRVJNSVNTSU9OX0RFTklFRBACEg0KCU5PVF9GT1VORBADEhMK' + 'D1NDSEVNQV9NSVNNQVRDSBAEEiMKH0lOX1RSQU5TSVRfTE9DQVRJT05fUkVTVFJJQ1RJT04QBR' + 'IiCh5WRVJURVhfQUlfTE9DQVRJT05fUkVTVFJJQ1RJT04QBg=='); + +@$core.Deprecated('Use bigtableConfigDescriptor instead') +const BigtableConfig$json = { + '1': 'BigtableConfig', + '2': [ + {'1': 'table', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'table'}, + { + '1': 'app_profile_id', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'appProfileId' + }, + { + '1': 'service_account_email', + '3': 3, + '4': 1, + '5': 9, + '8': {}, + '10': 'serviceAccountEmail' + }, + { + '1': 'write_metadata', + '3': 5, + '4': 1, + '5': 8, + '8': {}, + '10': 'writeMetadata' + }, + { + '1': 'state', + '3': 4, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.BigtableConfig.State', + '8': {}, + '10': 'state' + }, + ], + '4': [BigtableConfig_State$json], +}; + +@$core.Deprecated('Use bigtableConfigDescriptor instead') +const BigtableConfig_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'NOT_FOUND', '2': 2}, + {'1': 'APP_PROFILE_MISCONFIGURED', '2': 3}, + {'1': 'PERMISSION_DENIED', '2': 4}, + {'1': 'SCHEMA_MISMATCH', '2': 5}, + {'1': 'IN_TRANSIT_LOCATION_RESTRICTION', '2': 6}, + {'1': 'VERTEX_AI_LOCATION_RESTRICTION', '2': 7}, + ], +}; + +/// Descriptor for `BigtableConfig`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List bigtableConfigDescriptor = $convert.base64Decode( + 'Cg5CaWd0YWJsZUNvbmZpZxIZCgV0YWJsZRgBIAEoCUID4EEBUgV0YWJsZRIpCg5hcHBfcHJvZm' + 'lsZV9pZBgCIAEoCUID4EEBUgxhcHBQcm9maWxlSWQSNwoVc2VydmljZV9hY2NvdW50X2VtYWls' + 'GAMgASgJQgPgQQFSE3NlcnZpY2VBY2NvdW50RW1haWwSKgoOd3JpdGVfbWV0YWRhdGEYBSABKA' + 'hCA+BBAVINd3JpdGVNZXRhZGF0YRJBCgVzdGF0ZRgEIAEoDjImLmdvb2dsZS5wdWJzdWIudjEu' + 'QmlndGFibGVDb25maWcuU3RhdGVCA+BBA1IFc3RhdGUizQEKBVN0YXRlEhUKEVNUQVRFX1VOU1' + 'BFQ0lGSUVEEAASCgoGQUNUSVZFEAESDQoJTk9UX0ZPVU5EEAISHQoZQVBQX1BST0ZJTEVfTUlT' + 'Q09ORklHVVJFRBADEhUKEVBFUk1JU1NJT05fREVOSUVEEAQSEwoPU0NIRU1BX01JU01BVENIEA' + 'USIwofSU5fVFJBTlNJVF9MT0NBVElPTl9SRVNUUklDVElPThAGEiIKHlZFUlRFWF9BSV9MT0NB' + 'VElPTl9SRVNUUklDVElPThAH'); + +@$core.Deprecated('Use cloudStorageConfigDescriptor instead') +const CloudStorageConfig$json = { + '1': 'CloudStorageConfig', + '2': [ + {'1': 'bucket', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'bucket'}, + { + '1': 'filename_prefix', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'filenamePrefix' + }, + { + '1': 'filename_suffix', + '3': 3, + '4': 1, + '5': 9, + '8': {}, + '10': 'filenameSuffix' + }, + { + '1': 'filename_datetime_format', + '3': 10, + '4': 1, + '5': 9, + '8': {}, + '10': 'filenameDatetimeFormat' + }, + { + '1': 'text_config', + '3': 4, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.CloudStorageConfig.TextConfig', + '8': {}, + '9': 0, + '10': 'textConfig' + }, + { + '1': 'avro_config', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.CloudStorageConfig.AvroConfig', + '8': {}, + '9': 0, + '10': 'avroConfig' + }, + { + '1': 'max_duration', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.protobuf.Duration', + '8': {}, + '10': 'maxDuration' + }, + {'1': 'max_bytes', '3': 7, '4': 1, '5': 3, '8': {}, '10': 'maxBytes'}, + {'1': 'max_messages', '3': 8, '4': 1, '5': 3, '8': {}, '10': 'maxMessages'}, + { + '1': 'state', + '3': 9, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.CloudStorageConfig.State', + '8': {}, + '10': 'state' + }, + { + '1': 'service_account_email', + '3': 11, + '4': 1, + '5': 9, + '8': {}, + '10': 'serviceAccountEmail' + }, + ], + '3': [CloudStorageConfig_TextConfig$json, CloudStorageConfig_AvroConfig$json], + '4': [CloudStorageConfig_State$json], + '8': [ + {'1': 'output_format'}, + ], +}; + +@$core.Deprecated('Use cloudStorageConfigDescriptor instead') +const CloudStorageConfig_TextConfig$json = { + '1': 'TextConfig', +}; + +@$core.Deprecated('Use cloudStorageConfigDescriptor instead') +const CloudStorageConfig_AvroConfig$json = { + '1': 'AvroConfig', + '2': [ + { + '1': 'write_metadata', + '3': 1, + '4': 1, + '5': 8, + '8': {}, + '10': 'writeMetadata' + }, + { + '1': 'use_topic_schema', + '3': 2, + '4': 1, + '5': 8, + '8': {}, + '10': 'useTopicSchema' + }, + ], +}; + +@$core.Deprecated('Use cloudStorageConfigDescriptor instead') +const CloudStorageConfig_State$json = { + '1': 'State', + '2': [ + {'1': 'STATE_UNSPECIFIED', '2': 0}, + {'1': 'ACTIVE', '2': 1}, + {'1': 'PERMISSION_DENIED', '2': 2}, + {'1': 'NOT_FOUND', '2': 3}, + {'1': 'IN_TRANSIT_LOCATION_RESTRICTION', '2': 4}, + {'1': 'SCHEMA_MISMATCH', '2': 5}, + {'1': 'VERTEX_AI_LOCATION_RESTRICTION', '2': 6}, + ], +}; + +/// Descriptor for `CloudStorageConfig`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List cloudStorageConfigDescriptor = $convert.base64Decode( + 'ChJDbG91ZFN0b3JhZ2VDb25maWcSGwoGYnVja2V0GAEgASgJQgPgQQJSBmJ1Y2tldBIsCg9maW' + 'xlbmFtZV9wcmVmaXgYAiABKAlCA+BBAVIOZmlsZW5hbWVQcmVmaXgSLAoPZmlsZW5hbWVfc3Vm' + 'Zml4GAMgASgJQgPgQQFSDmZpbGVuYW1lU3VmZml4Ej0KGGZpbGVuYW1lX2RhdGV0aW1lX2Zvcm' + '1hdBgKIAEoCUID4EEBUhZmaWxlbmFtZURhdGV0aW1lRm9ybWF0ElcKC3RleHRfY29uZmlnGAQg' + 'ASgLMi8uZ29vZ2xlLnB1YnN1Yi52MS5DbG91ZFN0b3JhZ2VDb25maWcuVGV4dENvbmZpZ0ID4E' + 'EBSABSCnRleHRDb25maWcSVwoLYXZyb19jb25maWcYBSABKAsyLy5nb29nbGUucHVic3ViLnYx' + 'LkNsb3VkU3RvcmFnZUNvbmZpZy5BdnJvQ29uZmlnQgPgQQFIAFIKYXZyb0NvbmZpZxJBCgxtYX' + 'hfZHVyYXRpb24YBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CA+BBAVILbWF4RHVy' + 'YXRpb24SIAoJbWF4X2J5dGVzGAcgASgDQgPgQQFSCG1heEJ5dGVzEiYKDG1heF9tZXNzYWdlcx' + 'gIIAEoA0ID4EEBUgttYXhNZXNzYWdlcxJFCgVzdGF0ZRgJIAEoDjIqLmdvb2dsZS5wdWJzdWIu' + 'djEuQ2xvdWRTdG9yYWdlQ29uZmlnLlN0YXRlQgPgQQNSBXN0YXRlEjcKFXNlcnZpY2VfYWNjb3' + 'VudF9lbWFpbBgLIAEoCUID4EEBUhNzZXJ2aWNlQWNjb3VudEVtYWlsGgwKClRleHRDb25maWca' + 'ZwoKQXZyb0NvbmZpZxIqCg53cml0ZV9tZXRhZGF0YRgBIAEoCEID4EEBUg13cml0ZU1ldGFkYX' + 'RhEi0KEHVzZV90b3BpY19zY2hlbWEYAiABKAhCA+BBAVIOdXNlVG9waWNTY2hlbWEirgEKBVN0' + 'YXRlEhUKEVNUQVRFX1VOU1BFQ0lGSUVEEAASCgoGQUNUSVZFEAESFQoRUEVSTUlTU0lPTl9ERU' + '5JRUQQAhINCglOT1RfRk9VTkQQAxIjCh9JTl9UUkFOU0lUX0xPQ0FUSU9OX1JFU1RSSUNUSU9O' + 'EAQSEwoPU0NIRU1BX01JU01BVENIEAUSIgoeVkVSVEVYX0FJX0xPQ0FUSU9OX1JFU1RSSUNUSU' + '9OEAZCDwoNb3V0cHV0X2Zvcm1hdA=='); + +@$core.Deprecated('Use receivedMessageDescriptor instead') +const ReceivedMessage$json = { + '1': 'ReceivedMessage', + '2': [ + {'1': 'ack_id', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'ackId'}, + { + '1': 'message', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.PubsubMessage', + '8': {}, + '10': 'message' + }, + { + '1': 'delivery_attempt', + '3': 3, + '4': 1, + '5': 5, + '8': {}, + '10': 'deliveryAttempt' + }, + ], +}; + +/// Descriptor for `ReceivedMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List receivedMessageDescriptor = $convert.base64Decode( + 'Cg9SZWNlaXZlZE1lc3NhZ2USGgoGYWNrX2lkGAEgASgJQgPgQQFSBWFja0lkEj4KB21lc3NhZ2' + 'UYAiABKAsyHy5nb29nbGUucHVic3ViLnYxLlB1YnN1Yk1lc3NhZ2VCA+BBAVIHbWVzc2FnZRIu' + 'ChBkZWxpdmVyeV9hdHRlbXB0GAMgASgFQgPgQQFSD2RlbGl2ZXJ5QXR0ZW1wdA=='); + +@$core.Deprecated('Use getSubscriptionRequestDescriptor instead') +const GetSubscriptionRequest$json = { + '1': 'GetSubscriptionRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + ], +}; + +/// Descriptor for `GetSubscriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getSubscriptionRequestDescriptor = + $convert.base64Decode( + 'ChZHZXRTdWJzY3JpcHRpb25SZXF1ZXN0Ek4KDHN1YnNjcmlwdGlvbhgBIAEoCUIq4EEC+kEkCi' + 'JwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU3Vic2NyaXB0aW9uUgxzdWJzY3JpcHRpb24='); + +@$core.Deprecated('Use updateSubscriptionRequestDescriptor instead') +const UpdateSubscriptionRequest$json = { + '1': 'UpdateSubscriptionRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.Subscription', + '8': {}, + '10': 'subscription' + }, + { + '1': 'update_mask', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.protobuf.FieldMask', + '8': {}, + '10': 'updateMask' + }, + ], +}; + +/// Descriptor for `UpdateSubscriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List updateSubscriptionRequestDescriptor = $convert.base64Decode( + 'ChlVcGRhdGVTdWJzY3JpcHRpb25SZXF1ZXN0EkcKDHN1YnNjcmlwdGlvbhgBIAEoCzIeLmdvb2' + 'dsZS5wdWJzdWIudjEuU3Vic2NyaXB0aW9uQgPgQQJSDHN1YnNjcmlwdGlvbhJACgt1cGRhdGVf' + 'bWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBAlIKdXBkYXRlTWFzaw' + '=='); + +@$core.Deprecated('Use listSubscriptionsRequestDescriptor instead') +const ListSubscriptionsRequest$json = { + '1': 'ListSubscriptionsRequest', + '2': [ + {'1': 'project', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'project'}, + {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, + {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, + ], +}; + +/// Descriptor for `ListSubscriptionsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listSubscriptionsRequestDescriptor = $convert.base64Decode( + 'ChhMaXN0U3Vic2NyaXB0aW9uc1JlcXVlc3QSTQoHcHJvamVjdBgBIAEoCUIz4EEC+kEtCitjbG' + '91ZHJlc291cmNlbWFuYWdlci5nb29nbGVhcGlzLmNvbS9Qcm9qZWN0Ugdwcm9qZWN0EiAKCXBh' + 'Z2Vfc2l6ZRgCIAEoBUID4EEBUghwYWdlU2l6ZRIiCgpwYWdlX3Rva2VuGAMgASgJQgPgQQFSCX' + 'BhZ2VUb2tlbg=='); + +@$core.Deprecated('Use listSubscriptionsResponseDescriptor instead') +const ListSubscriptionsResponse$json = { + '1': 'ListSubscriptionsResponse', + '2': [ + { + '1': 'subscriptions', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Subscription', + '8': {}, + '10': 'subscriptions' + }, + { + '1': 'next_page_token', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'nextPageToken' + }, + ], +}; + +/// Descriptor for `ListSubscriptionsResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listSubscriptionsResponseDescriptor = $convert.base64Decode( + 'ChlMaXN0U3Vic2NyaXB0aW9uc1Jlc3BvbnNlEkkKDXN1YnNjcmlwdGlvbnMYASADKAsyHi5nb2' + '9nbGUucHVic3ViLnYxLlN1YnNjcmlwdGlvbkID4EEBUg1zdWJzY3JpcHRpb25zEisKD25leHRf' + 'cGFnZV90b2tlbhgCIAEoCUID4EEBUg1uZXh0UGFnZVRva2Vu'); + +@$core.Deprecated('Use deleteSubscriptionRequestDescriptor instead') +const DeleteSubscriptionRequest$json = { + '1': 'DeleteSubscriptionRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + ], +}; + +/// Descriptor for `DeleteSubscriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List deleteSubscriptionRequestDescriptor = + $convert.base64Decode( + 'ChlEZWxldGVTdWJzY3JpcHRpb25SZXF1ZXN0Ek4KDHN1YnNjcmlwdGlvbhgBIAEoCUIq4EEC+k' + 'EkCiJwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU3Vic2NyaXB0aW9uUgxzdWJzY3JpcHRpb24='); + +@$core.Deprecated('Use modifyPushConfigRequestDescriptor instead') +const ModifyPushConfigRequest$json = { + '1': 'ModifyPushConfigRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + { + '1': 'push_config', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.PushConfig', + '8': {}, + '10': 'pushConfig' + }, + ], +}; + +/// Descriptor for `ModifyPushConfigRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List modifyPushConfigRequestDescriptor = $convert.base64Decode( + 'ChdNb2RpZnlQdXNoQ29uZmlnUmVxdWVzdBJOCgxzdWJzY3JpcHRpb24YASABKAlCKuBBAvpBJA' + 'oicHVic3ViLmdvb2dsZWFwaXMuY29tL1N1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uEkIKC3B1' + 'c2hfY29uZmlnGAIgASgLMhwuZ29vZ2xlLnB1YnN1Yi52MS5QdXNoQ29uZmlnQgPgQQJSCnB1c2' + 'hDb25maWc='); + +@$core.Deprecated('Use pullRequestDescriptor instead') +const PullRequest$json = { + '1': 'PullRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + { + '1': 'return_immediately', + '3': 2, + '4': 1, + '5': 8, + '8': {'3': true}, + '10': 'returnImmediately', + }, + {'1': 'max_messages', '3': 3, '4': 1, '5': 5, '8': {}, '10': 'maxMessages'}, + ], +}; + +/// Descriptor for `PullRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List pullRequestDescriptor = $convert.base64Decode( + 'CgtQdWxsUmVxdWVzdBJOCgxzdWJzY3JpcHRpb24YASABKAlCKuBBAvpBJAoicHVic3ViLmdvb2' + 'dsZWFwaXMuY29tL1N1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uEjQKEnJldHVybl9pbW1lZGlh' + 'dGVseRgCIAEoCEIFGAHgQQFSEXJldHVybkltbWVkaWF0ZWx5EiYKDG1heF9tZXNzYWdlcxgDIA' + 'EoBUID4EECUgttYXhNZXNzYWdlcw=='); + +@$core.Deprecated('Use pullResponseDescriptor instead') +const PullResponse$json = { + '1': 'PullResponse', + '2': [ + { + '1': 'received_messages', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.ReceivedMessage', + '8': {}, + '10': 'receivedMessages' + }, + ], +}; + +/// Descriptor for `PullResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List pullResponseDescriptor = $convert.base64Decode( + 'CgxQdWxsUmVzcG9uc2USUwoRcmVjZWl2ZWRfbWVzc2FnZXMYASADKAsyIS5nb29nbGUucHVic3' + 'ViLnYxLlJlY2VpdmVkTWVzc2FnZUID4EEBUhByZWNlaXZlZE1lc3NhZ2Vz'); + +@$core.Deprecated('Use modifyAckDeadlineRequestDescriptor instead') +const ModifyAckDeadlineRequest$json = { + '1': 'ModifyAckDeadlineRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + {'1': 'ack_ids', '3': 4, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, + { + '1': 'ack_deadline_seconds', + '3': 3, + '4': 1, + '5': 5, + '8': {}, + '10': 'ackDeadlineSeconds' + }, + ], +}; + +/// Descriptor for `ModifyAckDeadlineRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List modifyAckDeadlineRequestDescriptor = $convert.base64Decode( + 'ChhNb2RpZnlBY2tEZWFkbGluZVJlcXVlc3QSTgoMc3Vic2NyaXB0aW9uGAEgASgJQirgQQL6QS' + 'QKInB1YnN1Yi5nb29nbGVhcGlzLmNvbS9TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbhIcCgdh' + 'Y2tfaWRzGAQgAygJQgPgQQJSBmFja0lkcxI1ChRhY2tfZGVhZGxpbmVfc2Vjb25kcxgDIAEoBU' + 'ID4EECUhJhY2tEZWFkbGluZVNlY29uZHM='); + +@$core.Deprecated('Use acknowledgeRequestDescriptor instead') +const AcknowledgeRequest$json = { + '1': 'AcknowledgeRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + {'1': 'ack_ids', '3': 2, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, + ], +}; + +/// Descriptor for `AcknowledgeRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List acknowledgeRequestDescriptor = $convert.base64Decode( + 'ChJBY2tub3dsZWRnZVJlcXVlc3QSTgoMc3Vic2NyaXB0aW9uGAEgASgJQirgQQL6QSQKInB1Yn' + 'N1Yi5nb29nbGVhcGlzLmNvbS9TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbhIcCgdhY2tfaWRz' + 'GAIgAygJQgPgQQJSBmFja0lkcw=='); + +@$core.Deprecated('Use streamingPullRequestDescriptor instead') +const StreamingPullRequest$json = { + '1': 'StreamingPullRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + {'1': 'ack_ids', '3': 2, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, + { + '1': 'modify_deadline_seconds', + '3': 3, + '4': 3, + '5': 5, + '8': {}, + '10': 'modifyDeadlineSeconds' + }, + { + '1': 'modify_deadline_ack_ids', + '3': 4, + '4': 3, + '5': 9, + '8': {}, + '10': 'modifyDeadlineAckIds' + }, + { + '1': 'stream_ack_deadline_seconds', + '3': 5, + '4': 1, + '5': 5, + '8': {}, + '10': 'streamAckDeadlineSeconds' + }, + {'1': 'client_id', '3': 6, '4': 1, '5': 9, '8': {}, '10': 'clientId'}, + { + '1': 'max_outstanding_messages', + '3': 7, + '4': 1, + '5': 3, + '8': {}, + '10': 'maxOutstandingMessages' + }, + { + '1': 'max_outstanding_bytes', + '3': 8, + '4': 1, + '5': 3, + '8': {}, + '10': 'maxOutstandingBytes' + }, + { + '1': 'protocol_version', + '3': 10, + '4': 1, + '5': 3, + '8': {}, + '10': 'protocolVersion' + }, + ], +}; + +/// Descriptor for `StreamingPullRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List streamingPullRequestDescriptor = $convert.base64Decode( + 'ChRTdHJlYW1pbmdQdWxsUmVxdWVzdBJOCgxzdWJzY3JpcHRpb24YASABKAlCKuBBAvpBJAoicH' + 'Vic3ViLmdvb2dsZWFwaXMuY29tL1N1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uEhwKB2Fja19p' + 'ZHMYAiADKAlCA+BBAVIGYWNrSWRzEjsKF21vZGlmeV9kZWFkbGluZV9zZWNvbmRzGAMgAygFQg' + 'PgQQFSFW1vZGlmeURlYWRsaW5lU2Vjb25kcxI6Chdtb2RpZnlfZGVhZGxpbmVfYWNrX2lkcxgE' + 'IAMoCUID4EEBUhRtb2RpZnlEZWFkbGluZUFja0lkcxJCChtzdHJlYW1fYWNrX2RlYWRsaW5lX3' + 'NlY29uZHMYBSABKAVCA+BBAlIYc3RyZWFtQWNrRGVhZGxpbmVTZWNvbmRzEiAKCWNsaWVudF9p' + 'ZBgGIAEoCUID4EEBUghjbGllbnRJZBI9ChhtYXhfb3V0c3RhbmRpbmdfbWVzc2FnZXMYByABKA' + 'NCA+BBAVIWbWF4T3V0c3RhbmRpbmdNZXNzYWdlcxI3ChVtYXhfb3V0c3RhbmRpbmdfYnl0ZXMY' + 'CCABKANCA+BBAVITbWF4T3V0c3RhbmRpbmdCeXRlcxIuChBwcm90b2NvbF92ZXJzaW9uGAogAS' + 'gDQgPgQQFSD3Byb3RvY29sVmVyc2lvbg=='); + +@$core.Deprecated('Use streamingPullResponseDescriptor instead') +const StreamingPullResponse$json = { + '1': 'StreamingPullResponse', + '2': [ + { + '1': 'received_messages', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.ReceivedMessage', + '8': {}, + '10': 'receivedMessages' + }, + { + '1': 'acknowledge_confirmation', + '3': 5, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.StreamingPullResponse.AcknowledgeConfirmation', + '8': {}, + '10': 'acknowledgeConfirmation' + }, + { + '1': 'modify_ack_deadline_confirmation', + '3': 3, + '4': 1, + '5': 11, + '6': + '.google.pubsub.v1.StreamingPullResponse.ModifyAckDeadlineConfirmation', + '8': {}, + '10': 'modifyAckDeadlineConfirmation' + }, + { + '1': 'subscription_properties', + '3': 4, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.StreamingPullResponse.SubscriptionProperties', + '8': {}, + '10': 'subscriptionProperties' + }, + ], + '3': [ + StreamingPullResponse_AcknowledgeConfirmation$json, + StreamingPullResponse_ModifyAckDeadlineConfirmation$json, + StreamingPullResponse_SubscriptionProperties$json + ], +}; + +@$core.Deprecated('Use streamingPullResponseDescriptor instead') +const StreamingPullResponse_AcknowledgeConfirmation$json = { + '1': 'AcknowledgeConfirmation', + '2': [ + {'1': 'ack_ids', '3': 1, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, + { + '1': 'invalid_ack_ids', + '3': 2, + '4': 3, + '5': 9, + '8': {}, + '10': 'invalidAckIds' + }, + { + '1': 'unordered_ack_ids', + '3': 3, + '4': 3, + '5': 9, + '8': {}, + '10': 'unorderedAckIds' + }, + { + '1': 'temporary_failed_ack_ids', + '3': 4, + '4': 3, + '5': 9, + '8': {}, + '10': 'temporaryFailedAckIds' + }, + ], +}; + +@$core.Deprecated('Use streamingPullResponseDescriptor instead') +const StreamingPullResponse_ModifyAckDeadlineConfirmation$json = { + '1': 'ModifyAckDeadlineConfirmation', + '2': [ + {'1': 'ack_ids', '3': 1, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, + { + '1': 'invalid_ack_ids', + '3': 2, + '4': 3, + '5': 9, + '8': {}, + '10': 'invalidAckIds' + }, + { + '1': 'temporary_failed_ack_ids', + '3': 3, + '4': 3, + '5': 9, + '8': {}, + '10': 'temporaryFailedAckIds' + }, + ], +}; + +@$core.Deprecated('Use streamingPullResponseDescriptor instead') +const StreamingPullResponse_SubscriptionProperties$json = { + '1': 'SubscriptionProperties', + '2': [ + { + '1': 'exactly_once_delivery_enabled', + '3': 1, + '4': 1, + '5': 8, + '8': {}, + '10': 'exactlyOnceDeliveryEnabled' + }, + { + '1': 'message_ordering_enabled', + '3': 2, + '4': 1, + '5': 8, + '8': {}, + '10': 'messageOrderingEnabled' + }, + ], +}; + +/// Descriptor for `StreamingPullResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List streamingPullResponseDescriptor = $convert.base64Decode( + 'ChVTdHJlYW1pbmdQdWxsUmVzcG9uc2USUwoRcmVjZWl2ZWRfbWVzc2FnZXMYASADKAsyIS5nb2' + '9nbGUucHVic3ViLnYxLlJlY2VpdmVkTWVzc2FnZUID4EEBUhByZWNlaXZlZE1lc3NhZ2VzEn8K' + 'GGFja25vd2xlZGdlX2NvbmZpcm1hdGlvbhgFIAEoCzI/Lmdvb2dsZS5wdWJzdWIudjEuU3RyZW' + 'FtaW5nUHVsbFJlc3BvbnNlLkFja25vd2xlZGdlQ29uZmlybWF0aW9uQgPgQQFSF2Fja25vd2xl' + 'ZGdlQ29uZmlybWF0aW9uEpMBCiBtb2RpZnlfYWNrX2RlYWRsaW5lX2NvbmZpcm1hdGlvbhgDIA' + 'EoCzJFLmdvb2dsZS5wdWJzdWIudjEuU3RyZWFtaW5nUHVsbFJlc3BvbnNlLk1vZGlmeUFja0Rl' + 'YWRsaW5lQ29uZmlybWF0aW9uQgPgQQFSHW1vZGlmeUFja0RlYWRsaW5lQ29uZmlybWF0aW9uEn' + 'wKF3N1YnNjcmlwdGlvbl9wcm9wZXJ0aWVzGAQgASgLMj4uZ29vZ2xlLnB1YnN1Yi52MS5TdHJl' + 'YW1pbmdQdWxsUmVzcG9uc2UuU3Vic2NyaXB0aW9uUHJvcGVydGllc0ID4EEBUhZzdWJzY3JpcH' + 'Rpb25Qcm9wZXJ0aWVzGtMBChdBY2tub3dsZWRnZUNvbmZpcm1hdGlvbhIcCgdhY2tfaWRzGAEg' + 'AygJQgPgQQFSBmFja0lkcxIrCg9pbnZhbGlkX2Fja19pZHMYAiADKAlCA+BBAVINaW52YWxpZE' + 'Fja0lkcxIvChF1bm9yZGVyZWRfYWNrX2lkcxgDIAMoCUID4EEBUg91bm9yZGVyZWRBY2tJZHMS' + 'PAoYdGVtcG9yYXJ5X2ZhaWxlZF9hY2tfaWRzGAQgAygJQgPgQQFSFXRlbXBvcmFyeUZhaWxlZE' + 'Fja0lkcxqoAQodTW9kaWZ5QWNrRGVhZGxpbmVDb25maXJtYXRpb24SHAoHYWNrX2lkcxgBIAMo' + 'CUID4EEBUgZhY2tJZHMSKwoPaW52YWxpZF9hY2tfaWRzGAIgAygJQgPgQQFSDWludmFsaWRBY2' + 'tJZHMSPAoYdGVtcG9yYXJ5X2ZhaWxlZF9hY2tfaWRzGAMgAygJQgPgQQFSFXRlbXBvcmFyeUZh' + 'aWxlZEFja0lkcxqfAQoWU3Vic2NyaXB0aW9uUHJvcGVydGllcxJGCh1leGFjdGx5X29uY2VfZG' + 'VsaXZlcnlfZW5hYmxlZBgBIAEoCEID4EEBUhpleGFjdGx5T25jZURlbGl2ZXJ5RW5hYmxlZBI9' + 'ChhtZXNzYWdlX29yZGVyaW5nX2VuYWJsZWQYAiABKAhCA+BBAVIWbWVzc2FnZU9yZGVyaW5nRW' + '5hYmxlZA=='); + +@$core.Deprecated('Use createSnapshotRequestDescriptor instead') +const CreateSnapshotRequest$json = { + '1': 'CreateSnapshotRequest', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + { + '1': 'subscription', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + { + '1': 'labels', + '3': 3, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.CreateSnapshotRequest.LabelsEntry', + '8': {}, + '10': 'labels' + }, + { + '1': 'tags', + '3': 4, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.CreateSnapshotRequest.TagsEntry', + '8': {}, + '10': 'tags' + }, + ], + '3': [ + CreateSnapshotRequest_LabelsEntry$json, + CreateSnapshotRequest_TagsEntry$json + ], +}; + +@$core.Deprecated('Use createSnapshotRequestDescriptor instead') +const CreateSnapshotRequest_LabelsEntry$json = { + '1': 'LabelsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +@$core.Deprecated('Use createSnapshotRequestDescriptor instead') +const CreateSnapshotRequest_TagsEntry$json = { + '1': 'TagsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +/// Descriptor for `CreateSnapshotRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List createSnapshotRequestDescriptor = $convert.base64Decode( + 'ChVDcmVhdGVTbmFwc2hvdFJlcXVlc3QSOgoEbmFtZRgBIAEoCUIm4EEC+kEgCh5wdWJzdWIuZ2' + '9vZ2xlYXBpcy5jb20vU25hcHNob3RSBG5hbWUSTgoMc3Vic2NyaXB0aW9uGAIgASgJQirgQQL6' + 'QSQKInB1YnN1Yi5nb29nbGVhcGlzLmNvbS9TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbhJQCg' + 'ZsYWJlbHMYAyADKAsyMy5nb29nbGUucHVic3ViLnYxLkNyZWF0ZVNuYXBzaG90UmVxdWVzdC5M' + 'YWJlbHNFbnRyeUID4EEBUgZsYWJlbHMSUAoEdGFncxgEIAMoCzIxLmdvb2dsZS5wdWJzdWIudj' + 'EuQ3JlYXRlU25hcHNob3RSZXF1ZXN0LlRhZ3NFbnRyeUIJ4EEE4EEF4EEBUgR0YWdzGjkKC0xh' + 'YmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaNw' + 'oJVGFnc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE='); + +@$core.Deprecated('Use updateSnapshotRequestDescriptor instead') +const UpdateSnapshotRequest$json = { + '1': 'UpdateSnapshotRequest', + '2': [ + { + '1': 'snapshot', + '3': 1, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.Snapshot', + '8': {}, + '10': 'snapshot' + }, + { + '1': 'update_mask', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.protobuf.FieldMask', + '8': {}, + '10': 'updateMask' + }, + ], +}; + +/// Descriptor for `UpdateSnapshotRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List updateSnapshotRequestDescriptor = $convert.base64Decode( + 'ChVVcGRhdGVTbmFwc2hvdFJlcXVlc3QSOwoIc25hcHNob3QYASABKAsyGi5nb29nbGUucHVic3' + 'ViLnYxLlNuYXBzaG90QgPgQQJSCHNuYXBzaG90EkAKC3VwZGF0ZV9tYXNrGAIgASgLMhouZ29v' + 'Z2xlLnByb3RvYnVmLkZpZWxkTWFza0ID4EECUgp1cGRhdGVNYXNr'); + +@$core.Deprecated('Use snapshotDescriptor instead') +const Snapshot$json = { + '1': 'Snapshot', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + {'1': 'topic', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'topic'}, + { + '1': 'expire_time', + '3': 3, + '4': 1, + '5': 11, + '6': '.google.protobuf.Timestamp', + '8': {}, + '10': 'expireTime' + }, + { + '1': 'labels', + '3': 4, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Snapshot.LabelsEntry', + '8': {}, + '10': 'labels' + }, + ], + '3': [Snapshot_LabelsEntry$json], + '7': {}, +}; + +@$core.Deprecated('Use snapshotDescriptor instead') +const Snapshot_LabelsEntry$json = { + '1': 'LabelsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +/// Descriptor for `Snapshot`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List snapshotDescriptor = $convert.base64Decode( + 'CghTbmFwc2hvdBIXCgRuYW1lGAEgASgJQgPgQQFSBG5hbWUSOQoFdG9waWMYAiABKAlCI+BBAf' + 'pBHQobcHVic3ViLmdvb2dsZWFwaXMuY29tL1RvcGljUgV0b3BpYxJACgtleHBpcmVfdGltZRgD' + 'IAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAVIKZXhwaXJlVGltZRJDCgZsYW' + 'JlbHMYBCADKAsyJi5nb29nbGUucHVic3ViLnYxLlNuYXBzaG90LkxhYmVsc0VudHJ5QgPgQQFS' + 'BmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCV' + 'IFdmFsdWU6AjgBOmHqQV4KHnB1YnN1Yi5nb29nbGVhcGlzLmNvbS9TbmFwc2hvdBIncHJvamVj' + 'dHMve3Byb2plY3R9L3NuYXBzaG90cy97c25hcHNob3R9KglzbmFwc2hvdHMyCHNuYXBzaG90'); + +@$core.Deprecated('Use getSnapshotRequestDescriptor instead') +const GetSnapshotRequest$json = { + '1': 'GetSnapshotRequest', + '2': [ + {'1': 'snapshot', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'snapshot'}, + ], +}; + +/// Descriptor for `GetSnapshotRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getSnapshotRequestDescriptor = $convert.base64Decode( + 'ChJHZXRTbmFwc2hvdFJlcXVlc3QSQgoIc25hcHNob3QYASABKAlCJuBBAvpBIAoecHVic3ViLm' + 'dvb2dsZWFwaXMuY29tL1NuYXBzaG90UghzbmFwc2hvdA=='); + +@$core.Deprecated('Use listSnapshotsRequestDescriptor instead') +const ListSnapshotsRequest$json = { + '1': 'ListSnapshotsRequest', + '2': [ + {'1': 'project', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'project'}, + {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, + {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, + ], +}; + +/// Descriptor for `ListSnapshotsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listSnapshotsRequestDescriptor = $convert.base64Decode( + 'ChRMaXN0U25hcHNob3RzUmVxdWVzdBJNCgdwcm9qZWN0GAEgASgJQjPgQQL6QS0KK2Nsb3Vkcm' + 'Vzb3VyY2VtYW5hZ2VyLmdvb2dsZWFwaXMuY29tL1Byb2plY3RSB3Byb2plY3QSIAoJcGFnZV9z' + 'aXplGAIgASgFQgPgQQFSCHBhZ2VTaXplEiIKCnBhZ2VfdG9rZW4YAyABKAlCA+BBAVIJcGFnZV' + 'Rva2Vu'); + +@$core.Deprecated('Use listSnapshotsResponseDescriptor instead') +const ListSnapshotsResponse$json = { + '1': 'ListSnapshotsResponse', + '2': [ + { + '1': 'snapshots', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Snapshot', + '8': {}, + '10': 'snapshots' + }, + { + '1': 'next_page_token', + '3': 2, + '4': 1, + '5': 9, + '8': {}, + '10': 'nextPageToken' + }, + ], +}; + +/// Descriptor for `ListSnapshotsResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listSnapshotsResponseDescriptor = $convert.base64Decode( + 'ChVMaXN0U25hcHNob3RzUmVzcG9uc2USPQoJc25hcHNob3RzGAEgAygLMhouZ29vZ2xlLnB1Yn' + 'N1Yi52MS5TbmFwc2hvdEID4EEBUglzbmFwc2hvdHMSKwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJ' + 'QgPgQQFSDW5leHRQYWdlVG9rZW4='); + +@$core.Deprecated('Use deleteSnapshotRequestDescriptor instead') +const DeleteSnapshotRequest$json = { + '1': 'DeleteSnapshotRequest', + '2': [ + {'1': 'snapshot', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'snapshot'}, + ], +}; + +/// Descriptor for `DeleteSnapshotRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List deleteSnapshotRequestDescriptor = $convert.base64Decode( + 'ChVEZWxldGVTbmFwc2hvdFJlcXVlc3QSQgoIc25hcHNob3QYASABKAlCJuBBAvpBIAoecHVic3' + 'ViLmdvb2dsZWFwaXMuY29tL1NuYXBzaG90UghzbmFwc2hvdA=='); + +@$core.Deprecated('Use seekRequestDescriptor instead') +const SeekRequest$json = { + '1': 'SeekRequest', + '2': [ + { + '1': 'subscription', + '3': 1, + '4': 1, + '5': 9, + '8': {}, + '10': 'subscription' + }, + { + '1': 'time', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.protobuf.Timestamp', + '8': {}, + '9': 0, + '10': 'time' + }, + { + '1': 'snapshot', + '3': 3, + '4': 1, + '5': 9, + '8': {}, + '9': 0, + '10': 'snapshot' + }, + ], + '8': [ + {'1': 'target'}, + ], +}; + +/// Descriptor for `SeekRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List seekRequestDescriptor = $convert.base64Decode( + 'CgtTZWVrUmVxdWVzdBJOCgxzdWJzY3JpcHRpb24YASABKAlCKuBBAvpBJAoicHVic3ViLmdvb2' + 'dsZWFwaXMuY29tL1N1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uEjUKBHRpbWUYAiABKAsyGi5n' + 'b29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQFIAFIEdGltZRJECghzbmFwc2hvdBgDIAEoCU' + 'Im4EEB+kEgCh5wdWJzdWIuZ29vZ2xlYXBpcy5jb20vU25hcHNob3RIAFIIc25hcHNob3RCCAoG' + 'dGFyZ2V0'); + +@$core.Deprecated('Use seekResponseDescriptor instead') +const SeekResponse$json = { + '1': 'SeekResponse', +}; + +/// Descriptor for `SeekResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List seekResponseDescriptor = + $convert.base64Decode('CgxTZWVrUmVzcG9uc2U='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pb.dart new file mode 100644 index 00000000..7a8766dd --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pb.dart @@ -0,0 +1,1383 @@ +// +// Generated code. Do not modify. +// source: google/pubsub/v1/schema.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +import '../../protobuf/timestamp.pb.dart' as $3; +import 'schema.pbenum.dart'; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +export 'schema.pbenum.dart'; + +/// A schema resource. +class Schema extends $pb.GeneratedMessage { + factory Schema({ + $core.String? name, + Schema_Type? type, + $core.String? definition, + $core.String? revisionId, + $3.Timestamp? revisionCreateTime, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (type != null) { + $result.type = type; + } + if (definition != null) { + $result.definition = definition; + } + if (revisionId != null) { + $result.revisionId = revisionId; + } + if (revisionCreateTime != null) { + $result.revisionCreateTime = revisionCreateTime; + } + return $result; + } + Schema._() : super(); + factory Schema.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Schema.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Schema', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..e(2, _omitFieldNames ? '' : 'type', $pb.PbFieldType.OE, + defaultOrMaker: Schema_Type.TYPE_UNSPECIFIED, + valueOf: Schema_Type.valueOf, + enumValues: Schema_Type.values) + ..aOS(3, _omitFieldNames ? '' : 'definition') + ..aOS(4, _omitFieldNames ? '' : 'revisionId') + ..aOM<$3.Timestamp>(6, _omitFieldNames ? '' : 'revisionCreateTime', + subBuilder: $3.Timestamp.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Schema clone() => Schema()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Schema copyWith(void Function(Schema) updates) => + super.copyWith((message) => updates(message as Schema)) as Schema; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Schema create() => Schema._(); + Schema createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Schema getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Schema? _defaultInstance; + + /// Required. Name of the schema. + /// Format is `projects/{project}/schemas/{schema}`. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// The type of the schema definition. + @$pb.TagNumber(2) + Schema_Type get type => $_getN(1); + @$pb.TagNumber(2) + set type(Schema_Type v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasType() => $_has(1); + @$pb.TagNumber(2) + void clearType() => $_clearField(2); + + /// The definition of the schema. This should contain a string representing + /// the full definition of the schema that is a valid schema definition of + /// the type specified in `type`. + @$pb.TagNumber(3) + $core.String get definition => $_getSZ(2); + @$pb.TagNumber(3) + set definition($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasDefinition() => $_has(2); + @$pb.TagNumber(3) + void clearDefinition() => $_clearField(3); + + /// Output only. Immutable. The revision ID of the schema. + @$pb.TagNumber(4) + $core.String get revisionId => $_getSZ(3); + @$pb.TagNumber(4) + set revisionId($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasRevisionId() => $_has(3); + @$pb.TagNumber(4) + void clearRevisionId() => $_clearField(4); + + /// Output only. The timestamp that the revision was created. + @$pb.TagNumber(6) + $3.Timestamp get revisionCreateTime => $_getN(4); + @$pb.TagNumber(6) + set revisionCreateTime($3.Timestamp v) { + $_setField(6, v); + } + + @$pb.TagNumber(6) + $core.bool hasRevisionCreateTime() => $_has(4); + @$pb.TagNumber(6) + void clearRevisionCreateTime() => $_clearField(6); + @$pb.TagNumber(6) + $3.Timestamp ensureRevisionCreateTime() => $_ensure(4); +} + +/// Request for the CreateSchema method. +class CreateSchemaRequest extends $pb.GeneratedMessage { + factory CreateSchemaRequest({ + $core.String? parent, + Schema? schema, + $core.String? schemaId, + }) { + final $result = create(); + if (parent != null) { + $result.parent = parent; + } + if (schema != null) { + $result.schema = schema; + } + if (schemaId != null) { + $result.schemaId = schemaId; + } + return $result; + } + CreateSchemaRequest._() : super(); + factory CreateSchemaRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory CreateSchemaRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CreateSchemaRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'parent') + ..aOM(2, _omitFieldNames ? '' : 'schema', subBuilder: Schema.create) + ..aOS(3, _omitFieldNames ? '' : 'schemaId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CreateSchemaRequest clone() => CreateSchemaRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CreateSchemaRequest copyWith(void Function(CreateSchemaRequest) updates) => + super.copyWith((message) => updates(message as CreateSchemaRequest)) + as CreateSchemaRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateSchemaRequest create() => CreateSchemaRequest._(); + CreateSchemaRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateSchemaRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CreateSchemaRequest? _defaultInstance; + + /// Required. The name of the project in which to create the schema. + /// Format is `projects/{project-id}`. + @$pb.TagNumber(1) + $core.String get parent => $_getSZ(0); + @$pb.TagNumber(1) + set parent($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasParent() => $_has(0); + @$pb.TagNumber(1) + void clearParent() => $_clearField(1); + + /// Required. The schema object to create. + /// + /// This schema's `name` parameter is ignored. The schema object returned + /// by CreateSchema will have a `name` made using the given `parent` and + /// `schema_id`. + @$pb.TagNumber(2) + Schema get schema => $_getN(1); + @$pb.TagNumber(2) + set schema(Schema v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasSchema() => $_has(1); + @$pb.TagNumber(2) + void clearSchema() => $_clearField(2); + @$pb.TagNumber(2) + Schema ensureSchema() => $_ensure(1); + + /// The ID to use for the schema, which will become the final component of + /// the schema's resource name. + /// + /// See https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names for + /// resource name constraints. + @$pb.TagNumber(3) + $core.String get schemaId => $_getSZ(2); + @$pb.TagNumber(3) + set schemaId($core.String v) { + $_setString(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasSchemaId() => $_has(2); + @$pb.TagNumber(3) + void clearSchemaId() => $_clearField(3); +} + +/// Request for the GetSchema method. +class GetSchemaRequest extends $pb.GeneratedMessage { + factory GetSchemaRequest({ + $core.String? name, + SchemaView? view, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (view != null) { + $result.view = view; + } + return $result; + } + GetSchemaRequest._() : super(); + factory GetSchemaRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory GetSchemaRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'GetSchemaRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..e(2, _omitFieldNames ? '' : 'view', $pb.PbFieldType.OE, + defaultOrMaker: SchemaView.SCHEMA_VIEW_UNSPECIFIED, + valueOf: SchemaView.valueOf, + enumValues: SchemaView.values) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetSchemaRequest clone() => GetSchemaRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetSchemaRequest copyWith(void Function(GetSchemaRequest) updates) => + super.copyWith((message) => updates(message as GetSchemaRequest)) + as GetSchemaRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static GetSchemaRequest create() => GetSchemaRequest._(); + GetSchemaRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static GetSchemaRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static GetSchemaRequest? _defaultInstance; + + /// Required. The name of the schema to get. + /// Format is `projects/{project}/schemas/{schema}`. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// The set of fields to return in the response. If not set, returns a Schema + /// with all fields filled out. Set to `BASIC` to omit the `definition`. + @$pb.TagNumber(2) + SchemaView get view => $_getN(1); + @$pb.TagNumber(2) + set view(SchemaView v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasView() => $_has(1); + @$pb.TagNumber(2) + void clearView() => $_clearField(2); +} + +/// Request for the `ListSchemas` method. +class ListSchemasRequest extends $pb.GeneratedMessage { + factory ListSchemasRequest({ + $core.String? parent, + SchemaView? view, + $core.int? pageSize, + $core.String? pageToken, + }) { + final $result = create(); + if (parent != null) { + $result.parent = parent; + } + if (view != null) { + $result.view = view; + } + if (pageSize != null) { + $result.pageSize = pageSize; + } + if (pageToken != null) { + $result.pageToken = pageToken; + } + return $result; + } + ListSchemasRequest._() : super(); + factory ListSchemasRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListSchemasRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListSchemasRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'parent') + ..e(2, _omitFieldNames ? '' : 'view', $pb.PbFieldType.OE, + defaultOrMaker: SchemaView.SCHEMA_VIEW_UNSPECIFIED, + valueOf: SchemaView.valueOf, + enumValues: SchemaView.values) + ..a<$core.int>(3, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.O3) + ..aOS(4, _omitFieldNames ? '' : 'pageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSchemasRequest clone() => ListSchemasRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSchemasRequest copyWith(void Function(ListSchemasRequest) updates) => + super.copyWith((message) => updates(message as ListSchemasRequest)) + as ListSchemasRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSchemasRequest create() => ListSchemasRequest._(); + ListSchemasRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSchemasRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListSchemasRequest? _defaultInstance; + + /// Required. The name of the project in which to list schemas. + /// Format is `projects/{project-id}`. + @$pb.TagNumber(1) + $core.String get parent => $_getSZ(0); + @$pb.TagNumber(1) + set parent($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasParent() => $_has(0); + @$pb.TagNumber(1) + void clearParent() => $_clearField(1); + + /// The set of Schema fields to return in the response. If not set, returns + /// Schemas with `name` and `type`, but not `definition`. Set to `FULL` to + /// retrieve all fields. + @$pb.TagNumber(2) + SchemaView get view => $_getN(1); + @$pb.TagNumber(2) + set view(SchemaView v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasView() => $_has(1); + @$pb.TagNumber(2) + void clearView() => $_clearField(2); + + /// Maximum number of schemas to return. + @$pb.TagNumber(3) + $core.int get pageSize => $_getIZ(2); + @$pb.TagNumber(3) + set pageSize($core.int v) { + $_setSignedInt32(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPageSize() => $_has(2); + @$pb.TagNumber(3) + void clearPageSize() => $_clearField(3); + + /// The value returned by the last `ListSchemasResponse`; indicates that + /// this is a continuation of a prior `ListSchemas` call, and that the + /// system should return the next page of data. + @$pb.TagNumber(4) + $core.String get pageToken => $_getSZ(3); + @$pb.TagNumber(4) + set pageToken($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasPageToken() => $_has(3); + @$pb.TagNumber(4) + void clearPageToken() => $_clearField(4); +} + +/// Response for the `ListSchemas` method. +class ListSchemasResponse extends $pb.GeneratedMessage { + factory ListSchemasResponse({ + $core.Iterable? schemas, + $core.String? nextPageToken, + }) { + final $result = create(); + if (schemas != null) { + $result.schemas.addAll(schemas); + } + if (nextPageToken != null) { + $result.nextPageToken = nextPageToken; + } + return $result; + } + ListSchemasResponse._() : super(); + factory ListSchemasResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListSchemasResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListSchemasResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pc(1, _omitFieldNames ? '' : 'schemas', $pb.PbFieldType.PM, + subBuilder: Schema.create) + ..aOS(2, _omitFieldNames ? '' : 'nextPageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSchemasResponse clone() => ListSchemasResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSchemasResponse copyWith(void Function(ListSchemasResponse) updates) => + super.copyWith((message) => updates(message as ListSchemasResponse)) + as ListSchemasResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSchemasResponse create() => ListSchemasResponse._(); + ListSchemasResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSchemasResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListSchemasResponse? _defaultInstance; + + /// The resulting schemas. + @$pb.TagNumber(1) + $pb.PbList get schemas => $_getList(0); + + /// If not empty, indicates that there may be more schemas that match the + /// request; this value should be passed in a new `ListSchemasRequest`. + @$pb.TagNumber(2) + $core.String get nextPageToken => $_getSZ(1); + @$pb.TagNumber(2) + set nextPageToken($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNextPageToken() => $_has(1); + @$pb.TagNumber(2) + void clearNextPageToken() => $_clearField(2); +} + +/// Request for the `ListSchemaRevisions` method. +class ListSchemaRevisionsRequest extends $pb.GeneratedMessage { + factory ListSchemaRevisionsRequest({ + $core.String? name, + SchemaView? view, + $core.int? pageSize, + $core.String? pageToken, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (view != null) { + $result.view = view; + } + if (pageSize != null) { + $result.pageSize = pageSize; + } + if (pageToken != null) { + $result.pageToken = pageToken; + } + return $result; + } + ListSchemaRevisionsRequest._() : super(); + factory ListSchemaRevisionsRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListSchemaRevisionsRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListSchemaRevisionsRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..e(2, _omitFieldNames ? '' : 'view', $pb.PbFieldType.OE, + defaultOrMaker: SchemaView.SCHEMA_VIEW_UNSPECIFIED, + valueOf: SchemaView.valueOf, + enumValues: SchemaView.values) + ..a<$core.int>(3, _omitFieldNames ? '' : 'pageSize', $pb.PbFieldType.O3) + ..aOS(4, _omitFieldNames ? '' : 'pageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSchemaRevisionsRequest clone() => + ListSchemaRevisionsRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSchemaRevisionsRequest copyWith( + void Function(ListSchemaRevisionsRequest) updates) => + super.copyWith( + (message) => updates(message as ListSchemaRevisionsRequest)) + as ListSchemaRevisionsRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSchemaRevisionsRequest create() => ListSchemaRevisionsRequest._(); + ListSchemaRevisionsRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSchemaRevisionsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListSchemaRevisionsRequest? _defaultInstance; + + /// Required. The name of the schema to list revisions for. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// The set of Schema fields to return in the response. If not set, returns + /// Schemas with `name` and `type`, but not `definition`. Set to `FULL` to + /// retrieve all fields. + @$pb.TagNumber(2) + SchemaView get view => $_getN(1); + @$pb.TagNumber(2) + set view(SchemaView v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasView() => $_has(1); + @$pb.TagNumber(2) + void clearView() => $_clearField(2); + + /// The maximum number of revisions to return per page. + @$pb.TagNumber(3) + $core.int get pageSize => $_getIZ(2); + @$pb.TagNumber(3) + set pageSize($core.int v) { + $_setSignedInt32(2, v); + } + + @$pb.TagNumber(3) + $core.bool hasPageSize() => $_has(2); + @$pb.TagNumber(3) + void clearPageSize() => $_clearField(3); + + /// The page token, received from a previous ListSchemaRevisions call. + /// Provide this to retrieve the subsequent page. + @$pb.TagNumber(4) + $core.String get pageToken => $_getSZ(3); + @$pb.TagNumber(4) + set pageToken($core.String v) { + $_setString(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasPageToken() => $_has(3); + @$pb.TagNumber(4) + void clearPageToken() => $_clearField(4); +} + +/// Response for the `ListSchemaRevisions` method. +class ListSchemaRevisionsResponse extends $pb.GeneratedMessage { + factory ListSchemaRevisionsResponse({ + $core.Iterable? schemas, + $core.String? nextPageToken, + }) { + final $result = create(); + if (schemas != null) { + $result.schemas.addAll(schemas); + } + if (nextPageToken != null) { + $result.nextPageToken = nextPageToken; + } + return $result; + } + ListSchemaRevisionsResponse._() : super(); + factory ListSchemaRevisionsResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ListSchemaRevisionsResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListSchemaRevisionsResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..pc(1, _omitFieldNames ? '' : 'schemas', $pb.PbFieldType.PM, + subBuilder: Schema.create) + ..aOS(2, _omitFieldNames ? '' : 'nextPageToken') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSchemaRevisionsResponse clone() => + ListSchemaRevisionsResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListSchemaRevisionsResponse copyWith( + void Function(ListSchemaRevisionsResponse) updates) => + super.copyWith( + (message) => updates(message as ListSchemaRevisionsResponse)) + as ListSchemaRevisionsResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSchemaRevisionsResponse create() => + ListSchemaRevisionsResponse._(); + ListSchemaRevisionsResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSchemaRevisionsResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListSchemaRevisionsResponse? _defaultInstance; + + /// The revisions of the schema. + @$pb.TagNumber(1) + $pb.PbList get schemas => $_getList(0); + + /// A token that can be sent as `page_token` to retrieve the next page. + /// If this field is empty, there are no subsequent pages. + @$pb.TagNumber(2) + $core.String get nextPageToken => $_getSZ(1); + @$pb.TagNumber(2) + set nextPageToken($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasNextPageToken() => $_has(1); + @$pb.TagNumber(2) + void clearNextPageToken() => $_clearField(2); +} + +/// Request for CommitSchema method. +class CommitSchemaRequest extends $pb.GeneratedMessage { + factory CommitSchemaRequest({ + $core.String? name, + Schema? schema, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (schema != null) { + $result.schema = schema; + } + return $result; + } + CommitSchemaRequest._() : super(); + factory CommitSchemaRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory CommitSchemaRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CommitSchemaRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..aOM(2, _omitFieldNames ? '' : 'schema', subBuilder: Schema.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CommitSchemaRequest clone() => CommitSchemaRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CommitSchemaRequest copyWith(void Function(CommitSchemaRequest) updates) => + super.copyWith((message) => updates(message as CommitSchemaRequest)) + as CommitSchemaRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CommitSchemaRequest create() => CommitSchemaRequest._(); + CommitSchemaRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CommitSchemaRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CommitSchemaRequest? _defaultInstance; + + /// Required. The name of the schema we are revising. + /// Format is `projects/{project}/schemas/{schema}`. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// Required. The schema revision to commit. + @$pb.TagNumber(2) + Schema get schema => $_getN(1); + @$pb.TagNumber(2) + set schema(Schema v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasSchema() => $_has(1); + @$pb.TagNumber(2) + void clearSchema() => $_clearField(2); + @$pb.TagNumber(2) + Schema ensureSchema() => $_ensure(1); +} + +/// Request for the `RollbackSchema` method. +class RollbackSchemaRequest extends $pb.GeneratedMessage { + factory RollbackSchemaRequest({ + $core.String? name, + $core.String? revisionId, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (revisionId != null) { + $result.revisionId = revisionId; + } + return $result; + } + RollbackSchemaRequest._() : super(); + factory RollbackSchemaRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory RollbackSchemaRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'RollbackSchemaRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..aOS(2, _omitFieldNames ? '' : 'revisionId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + RollbackSchemaRequest clone() => + RollbackSchemaRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + RollbackSchemaRequest copyWith( + void Function(RollbackSchemaRequest) updates) => + super.copyWith((message) => updates(message as RollbackSchemaRequest)) + as RollbackSchemaRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static RollbackSchemaRequest create() => RollbackSchemaRequest._(); + RollbackSchemaRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RollbackSchemaRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static RollbackSchemaRequest? _defaultInstance; + + /// Required. The schema being rolled back with revision id. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// Required. The revision ID to roll back to. + /// It must be a revision of the same schema. + /// + /// Example: c7cfa2a8 + @$pb.TagNumber(2) + $core.String get revisionId => $_getSZ(1); + @$pb.TagNumber(2) + set revisionId($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasRevisionId() => $_has(1); + @$pb.TagNumber(2) + void clearRevisionId() => $_clearField(2); +} + +/// Request for the `DeleteSchemaRevision` method. +class DeleteSchemaRevisionRequest extends $pb.GeneratedMessage { + factory DeleteSchemaRevisionRequest({ + $core.String? name, + @$core.Deprecated('This field is deprecated.') $core.String? revisionId, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + if (revisionId != null) { + // ignore: deprecated_member_use_from_same_package + $result.revisionId = revisionId; + } + return $result; + } + DeleteSchemaRevisionRequest._() : super(); + factory DeleteSchemaRevisionRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DeleteSchemaRevisionRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DeleteSchemaRevisionRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..aOS(2, _omitFieldNames ? '' : 'revisionId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteSchemaRevisionRequest clone() => + DeleteSchemaRevisionRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteSchemaRevisionRequest copyWith( + void Function(DeleteSchemaRevisionRequest) updates) => + super.copyWith( + (message) => updates(message as DeleteSchemaRevisionRequest)) + as DeleteSchemaRevisionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DeleteSchemaRevisionRequest create() => + DeleteSchemaRevisionRequest._(); + DeleteSchemaRevisionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DeleteSchemaRevisionRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DeleteSchemaRevisionRequest? _defaultInstance; + + /// Required. The name of the schema revision to be deleted, with a revision ID + /// explicitly included. + /// + /// Example: `projects/123/schemas/my-schema@c7cfa2a8` + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); + + /// Optional. This field is deprecated and should not be used for specifying + /// the revision ID. The revision ID should be specified via the `name` + /// parameter. + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(2) + $core.String get revisionId => $_getSZ(1); + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(2) + set revisionId($core.String v) { + $_setString(1, v); + } + + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(2) + $core.bool hasRevisionId() => $_has(1); + @$core.Deprecated('This field is deprecated.') + @$pb.TagNumber(2) + void clearRevisionId() => $_clearField(2); +} + +/// Request for the `DeleteSchema` method. +class DeleteSchemaRequest extends $pb.GeneratedMessage { + factory DeleteSchemaRequest({ + $core.String? name, + }) { + final $result = create(); + if (name != null) { + $result.name = name; + } + return $result; + } + DeleteSchemaRequest._() : super(); + factory DeleteSchemaRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DeleteSchemaRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DeleteSchemaRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'name') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteSchemaRequest clone() => DeleteSchemaRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DeleteSchemaRequest copyWith(void Function(DeleteSchemaRequest) updates) => + super.copyWith((message) => updates(message as DeleteSchemaRequest)) + as DeleteSchemaRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DeleteSchemaRequest create() => DeleteSchemaRequest._(); + DeleteSchemaRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static DeleteSchemaRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DeleteSchemaRequest? _defaultInstance; + + /// Required. Name of the schema to delete. + /// Format is `projects/{project}/schemas/{schema}`. + @$pb.TagNumber(1) + $core.String get name => $_getSZ(0); + @$pb.TagNumber(1) + set name($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasName() => $_has(0); + @$pb.TagNumber(1) + void clearName() => $_clearField(1); +} + +/// Request for the `ValidateSchema` method. +class ValidateSchemaRequest extends $pb.GeneratedMessage { + factory ValidateSchemaRequest({ + $core.String? parent, + Schema? schema, + }) { + final $result = create(); + if (parent != null) { + $result.parent = parent; + } + if (schema != null) { + $result.schema = schema; + } + return $result; + } + ValidateSchemaRequest._() : super(); + factory ValidateSchemaRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ValidateSchemaRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ValidateSchemaRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'parent') + ..aOM(2, _omitFieldNames ? '' : 'schema', subBuilder: Schema.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ValidateSchemaRequest clone() => + ValidateSchemaRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ValidateSchemaRequest copyWith( + void Function(ValidateSchemaRequest) updates) => + super.copyWith((message) => updates(message as ValidateSchemaRequest)) + as ValidateSchemaRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ValidateSchemaRequest create() => ValidateSchemaRequest._(); + ValidateSchemaRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ValidateSchemaRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ValidateSchemaRequest? _defaultInstance; + + /// Required. The name of the project in which to validate schemas. + /// Format is `projects/{project-id}`. + @$pb.TagNumber(1) + $core.String get parent => $_getSZ(0); + @$pb.TagNumber(1) + set parent($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasParent() => $_has(0); + @$pb.TagNumber(1) + void clearParent() => $_clearField(1); + + /// Required. The schema object to validate. + @$pb.TagNumber(2) + Schema get schema => $_getN(1); + @$pb.TagNumber(2) + set schema(Schema v) { + $_setField(2, v); + } + + @$pb.TagNumber(2) + $core.bool hasSchema() => $_has(1); + @$pb.TagNumber(2) + void clearSchema() => $_clearField(2); + @$pb.TagNumber(2) + Schema ensureSchema() => $_ensure(1); +} + +/// Response for the `ValidateSchema` method. +/// Empty for now. +class ValidateSchemaResponse extends $pb.GeneratedMessage { + factory ValidateSchemaResponse() => create(); + ValidateSchemaResponse._() : super(); + factory ValidateSchemaResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ValidateSchemaResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ValidateSchemaResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ValidateSchemaResponse clone() => + ValidateSchemaResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ValidateSchemaResponse copyWith( + void Function(ValidateSchemaResponse) updates) => + super.copyWith((message) => updates(message as ValidateSchemaResponse)) + as ValidateSchemaResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ValidateSchemaResponse create() => ValidateSchemaResponse._(); + ValidateSchemaResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ValidateSchemaResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ValidateSchemaResponse? _defaultInstance; +} + +enum ValidateMessageRequest_SchemaSpec { name, schema, notSet } + +/// Request for the `ValidateMessage` method. +class ValidateMessageRequest extends $pb.GeneratedMessage { + factory ValidateMessageRequest({ + $core.String? parent, + $core.String? name, + Schema? schema, + $core.List<$core.int>? message, + Encoding? encoding, + }) { + final $result = create(); + if (parent != null) { + $result.parent = parent; + } + if (name != null) { + $result.name = name; + } + if (schema != null) { + $result.schema = schema; + } + if (message != null) { + $result.message = message; + } + if (encoding != null) { + $result.encoding = encoding; + } + return $result; + } + ValidateMessageRequest._() : super(); + factory ValidateMessageRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ValidateMessageRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, ValidateMessageRequest_SchemaSpec> + _ValidateMessageRequest_SchemaSpecByTag = { + 2: ValidateMessageRequest_SchemaSpec.name, + 3: ValidateMessageRequest_SchemaSpec.schema, + 0: ValidateMessageRequest_SchemaSpec.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ValidateMessageRequest', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..oo(0, [2, 3]) + ..aOS(1, _omitFieldNames ? '' : 'parent') + ..aOS(2, _omitFieldNames ? '' : 'name') + ..aOM(3, _omitFieldNames ? '' : 'schema', subBuilder: Schema.create) + ..a<$core.List<$core.int>>( + 4, _omitFieldNames ? '' : 'message', $pb.PbFieldType.OY) + ..e(5, _omitFieldNames ? '' : 'encoding', $pb.PbFieldType.OE, + defaultOrMaker: Encoding.ENCODING_UNSPECIFIED, + valueOf: Encoding.valueOf, + enumValues: Encoding.values) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ValidateMessageRequest clone() => + ValidateMessageRequest()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ValidateMessageRequest copyWith( + void Function(ValidateMessageRequest) updates) => + super.copyWith((message) => updates(message as ValidateMessageRequest)) + as ValidateMessageRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ValidateMessageRequest create() => ValidateMessageRequest._(); + ValidateMessageRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ValidateMessageRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ValidateMessageRequest? _defaultInstance; + + ValidateMessageRequest_SchemaSpec whichSchemaSpec() => + _ValidateMessageRequest_SchemaSpecByTag[$_whichOneof(0)]!; + void clearSchemaSpec() => $_clearField($_whichOneof(0)); + + /// Required. The name of the project in which to validate schemas. + /// Format is `projects/{project-id}`. + @$pb.TagNumber(1) + $core.String get parent => $_getSZ(0); + @$pb.TagNumber(1) + set parent($core.String v) { + $_setString(0, v); + } + + @$pb.TagNumber(1) + $core.bool hasParent() => $_has(0); + @$pb.TagNumber(1) + void clearParent() => $_clearField(1); + + /// Name of the schema against which to validate. + /// + /// Format is `projects/{project}/schemas/{schema}`. + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { + $_setString(1, v); + } + + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => $_clearField(2); + + /// Ad-hoc schema against which to validate + @$pb.TagNumber(3) + Schema get schema => $_getN(2); + @$pb.TagNumber(3) + set schema(Schema v) { + $_setField(3, v); + } + + @$pb.TagNumber(3) + $core.bool hasSchema() => $_has(2); + @$pb.TagNumber(3) + void clearSchema() => $_clearField(3); + @$pb.TagNumber(3) + Schema ensureSchema() => $_ensure(2); + + /// Message to validate against the provided `schema_spec`. + @$pb.TagNumber(4) + $core.List<$core.int> get message => $_getN(3); + @$pb.TagNumber(4) + set message($core.List<$core.int> v) { + $_setBytes(3, v); + } + + @$pb.TagNumber(4) + $core.bool hasMessage() => $_has(3); + @$pb.TagNumber(4) + void clearMessage() => $_clearField(4); + + /// The encoding expected for messages + @$pb.TagNumber(5) + Encoding get encoding => $_getN(4); + @$pb.TagNumber(5) + set encoding(Encoding v) { + $_setField(5, v); + } + + @$pb.TagNumber(5) + $core.bool hasEncoding() => $_has(4); + @$pb.TagNumber(5) + void clearEncoding() => $_clearField(5); +} + +/// Response for the `ValidateMessage` method. +/// Empty for now. +class ValidateMessageResponse extends $pb.GeneratedMessage { + factory ValidateMessageResponse() => create(); + ValidateMessageResponse._() : super(); + factory ValidateMessageResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ValidateMessageResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ValidateMessageResponse', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ValidateMessageResponse clone() => + ValidateMessageResponse()..mergeFromMessage(this); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ValidateMessageResponse copyWith( + void Function(ValidateMessageResponse) updates) => + super.copyWith((message) => updates(message as ValidateMessageResponse)) + as ValidateMessageResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ValidateMessageResponse create() => ValidateMessageResponse._(); + ValidateMessageResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ValidateMessageResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ValidateMessageResponse? _defaultInstance; +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbenum.dart new file mode 100644 index 00000000..7650fb74 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbenum.dart @@ -0,0 +1,99 @@ +// +// Generated code. Do not modify. +// source: google/pubsub/v1/schema.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +/// View of Schema object fields to be returned by GetSchema and ListSchemas. +class SchemaView extends $pb.ProtobufEnum { + /// The default / unset value. + /// The API will default to the BASIC view. + static const SchemaView SCHEMA_VIEW_UNSPECIFIED = + SchemaView._(0, _omitEnumNames ? '' : 'SCHEMA_VIEW_UNSPECIFIED'); + + /// Include the name and type of the schema, but not the definition. + static const SchemaView BASIC = + SchemaView._(1, _omitEnumNames ? '' : 'BASIC'); + + /// Include all Schema object fields. + static const SchemaView FULL = SchemaView._(2, _omitEnumNames ? '' : 'FULL'); + + static const $core.List values = [ + SCHEMA_VIEW_UNSPECIFIED, + BASIC, + FULL, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 2); + static SchemaView? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const SchemaView._(super.v, super.n); +} + +/// Possible encoding types for messages. +class Encoding extends $pb.ProtobufEnum { + /// Unspecified + static const Encoding ENCODING_UNSPECIFIED = + Encoding._(0, _omitEnumNames ? '' : 'ENCODING_UNSPECIFIED'); + + /// JSON encoding + static const Encoding JSON = Encoding._(1, _omitEnumNames ? '' : 'JSON'); + + /// Binary encoding, as defined by the schema type. For some schema types, + /// binary encoding may not be available. + static const Encoding BINARY = Encoding._(2, _omitEnumNames ? '' : 'BINARY'); + + static const $core.List values = [ + ENCODING_UNSPECIFIED, + JSON, + BINARY, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 2); + static Encoding? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const Encoding._(super.v, super.n); +} + +/// Possible schema definition types. +class Schema_Type extends $pb.ProtobufEnum { + /// Default value. This value is unused. + static const Schema_Type TYPE_UNSPECIFIED = + Schema_Type._(0, _omitEnumNames ? '' : 'TYPE_UNSPECIFIED'); + + /// A Protocol Buffer schema definition. + static const Schema_Type PROTOCOL_BUFFER = + Schema_Type._(1, _omitEnumNames ? '' : 'PROTOCOL_BUFFER'); + + /// An Avro schema definition. + static const Schema_Type AVRO = + Schema_Type._(2, _omitEnumNames ? '' : 'AVRO'); + + static const $core.List values = [ + TYPE_UNSPECIFIED, + PROTOCOL_BUFFER, + AVRO, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 2); + static Schema_Type? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const Schema_Type._(super.v, super.n); +} + +const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbgrpc.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbgrpc.dart new file mode 100644 index 00000000..ab295e4a --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbgrpc.dart @@ -0,0 +1,321 @@ +// +// Generated code. Do not modify. +// source: google/pubsub/v1/schema.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:async' as $async; +import 'dart:core' as $core; + +import 'package:grpc/service_api.dart' as $grpc; +import 'package:protobuf/protobuf.dart' as $pb; + +import '../../protobuf/empty.pb.dart' as $1; +import 'schema.pb.dart' as $2; + +export 'schema.pb.dart'; + +/// Service for doing schema-related operations. +@$pb.GrpcServiceName('google.pubsub.v1.SchemaService') +class SchemaServiceClient extends $grpc.Client { + /// The hostname for this service. + static const $core.String defaultHost = 'pubsub.googleapis.com'; + + /// OAuth scopes needed for the client. + static const $core.List<$core.String> oauthScopes = [ + 'https://www.googleapis.com/auth/cloud-platform', + 'https://www.googleapis.com/auth/pubsub', + ]; + + static final _$createSchema = + $grpc.ClientMethod<$2.CreateSchemaRequest, $2.Schema>( + '/google.pubsub.v1.SchemaService/CreateSchema', + ($2.CreateSchemaRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); + static final _$getSchema = $grpc.ClientMethod<$2.GetSchemaRequest, $2.Schema>( + '/google.pubsub.v1.SchemaService/GetSchema', + ($2.GetSchemaRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); + static final _$listSchemas = + $grpc.ClientMethod<$2.ListSchemasRequest, $2.ListSchemasResponse>( + '/google.pubsub.v1.SchemaService/ListSchemas', + ($2.ListSchemasRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $2.ListSchemasResponse.fromBuffer(value)); + static final _$listSchemaRevisions = $grpc.ClientMethod< + $2.ListSchemaRevisionsRequest, $2.ListSchemaRevisionsResponse>( + '/google.pubsub.v1.SchemaService/ListSchemaRevisions', + ($2.ListSchemaRevisionsRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $2.ListSchemaRevisionsResponse.fromBuffer(value)); + static final _$commitSchema = + $grpc.ClientMethod<$2.CommitSchemaRequest, $2.Schema>( + '/google.pubsub.v1.SchemaService/CommitSchema', + ($2.CommitSchemaRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); + static final _$rollbackSchema = + $grpc.ClientMethod<$2.RollbackSchemaRequest, $2.Schema>( + '/google.pubsub.v1.SchemaService/RollbackSchema', + ($2.RollbackSchemaRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); + static final _$deleteSchemaRevision = + $grpc.ClientMethod<$2.DeleteSchemaRevisionRequest, $2.Schema>( + '/google.pubsub.v1.SchemaService/DeleteSchemaRevision', + ($2.DeleteSchemaRevisionRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); + static final _$deleteSchema = + $grpc.ClientMethod<$2.DeleteSchemaRequest, $1.Empty>( + '/google.pubsub.v1.SchemaService/DeleteSchema', + ($2.DeleteSchemaRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); + static final _$validateSchema = + $grpc.ClientMethod<$2.ValidateSchemaRequest, $2.ValidateSchemaResponse>( + '/google.pubsub.v1.SchemaService/ValidateSchema', + ($2.ValidateSchemaRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $2.ValidateSchemaResponse.fromBuffer(value)); + static final _$validateMessage = + $grpc.ClientMethod<$2.ValidateMessageRequest, $2.ValidateMessageResponse>( + '/google.pubsub.v1.SchemaService/ValidateMessage', + ($2.ValidateMessageRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $2.ValidateMessageResponse.fromBuffer(value)); + + SchemaServiceClient(super.channel, {super.options, super.interceptors}); + + /// Creates a schema. + $grpc.ResponseFuture<$2.Schema> createSchema($2.CreateSchemaRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$createSchema, request, options: options); + } + + /// Gets a schema. + $grpc.ResponseFuture<$2.Schema> getSchema($2.GetSchemaRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$getSchema, request, options: options); + } + + /// Lists schemas in a project. + $grpc.ResponseFuture<$2.ListSchemasResponse> listSchemas( + $2.ListSchemasRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$listSchemas, request, options: options); + } + + /// Lists all schema revisions for the named schema. + $grpc.ResponseFuture<$2.ListSchemaRevisionsResponse> listSchemaRevisions( + $2.ListSchemaRevisionsRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$listSchemaRevisions, request, options: options); + } + + /// Commits a new schema revision to an existing schema. + $grpc.ResponseFuture<$2.Schema> commitSchema($2.CommitSchemaRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$commitSchema, request, options: options); + } + + /// Creates a new schema revision that is a copy of the provided revision_id. + $grpc.ResponseFuture<$2.Schema> rollbackSchema( + $2.RollbackSchemaRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$rollbackSchema, request, options: options); + } + + /// Deletes a specific schema revision. + $grpc.ResponseFuture<$2.Schema> deleteSchemaRevision( + $2.DeleteSchemaRevisionRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$deleteSchemaRevision, request, options: options); + } + + /// Deletes a schema. + $grpc.ResponseFuture<$1.Empty> deleteSchema($2.DeleteSchemaRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$deleteSchema, request, options: options); + } + + /// Validates a schema. + $grpc.ResponseFuture<$2.ValidateSchemaResponse> validateSchema( + $2.ValidateSchemaRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$validateSchema, request, options: options); + } + + /// Validates a message against a schema. + $grpc.ResponseFuture<$2.ValidateMessageResponse> validateMessage( + $2.ValidateMessageRequest request, + {$grpc.CallOptions? options}) { + return $createUnaryCall(_$validateMessage, request, options: options); + } +} + +@$pb.GrpcServiceName('google.pubsub.v1.SchemaService') +abstract class SchemaServiceBase extends $grpc.Service { + $core.String get $name => 'google.pubsub.v1.SchemaService'; + + SchemaServiceBase() { + $addMethod($grpc.ServiceMethod<$2.CreateSchemaRequest, $2.Schema>( + 'CreateSchema', + createSchema_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.CreateSchemaRequest.fromBuffer(value), + ($2.Schema value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$2.GetSchemaRequest, $2.Schema>( + 'GetSchema', + getSchema_Pre, + false, + false, + ($core.List<$core.int> value) => $2.GetSchemaRequest.fromBuffer(value), + ($2.Schema value) => value.writeToBuffer())); + $addMethod( + $grpc.ServiceMethod<$2.ListSchemasRequest, $2.ListSchemasResponse>( + 'ListSchemas', + listSchemas_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.ListSchemasRequest.fromBuffer(value), + ($2.ListSchemasResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$2.ListSchemaRevisionsRequest, + $2.ListSchemaRevisionsResponse>( + 'ListSchemaRevisions', + listSchemaRevisions_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.ListSchemaRevisionsRequest.fromBuffer(value), + ($2.ListSchemaRevisionsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$2.CommitSchemaRequest, $2.Schema>( + 'CommitSchema', + commitSchema_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.CommitSchemaRequest.fromBuffer(value), + ($2.Schema value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$2.RollbackSchemaRequest, $2.Schema>( + 'RollbackSchema', + rollbackSchema_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.RollbackSchemaRequest.fromBuffer(value), + ($2.Schema value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$2.DeleteSchemaRevisionRequest, $2.Schema>( + 'DeleteSchemaRevision', + deleteSchemaRevision_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.DeleteSchemaRevisionRequest.fromBuffer(value), + ($2.Schema value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$2.DeleteSchemaRequest, $1.Empty>( + 'DeleteSchema', + deleteSchema_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.DeleteSchemaRequest.fromBuffer(value), + ($1.Empty value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$2.ValidateSchemaRequest, + $2.ValidateSchemaResponse>( + 'ValidateSchema', + validateSchema_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.ValidateSchemaRequest.fromBuffer(value), + ($2.ValidateSchemaResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$2.ValidateMessageRequest, + $2.ValidateMessageResponse>( + 'ValidateMessage', + validateMessage_Pre, + false, + false, + ($core.List<$core.int> value) => + $2.ValidateMessageRequest.fromBuffer(value), + ($2.ValidateMessageResponse value) => value.writeToBuffer())); + } + + $async.Future<$2.Schema> createSchema_Pre($grpc.ServiceCall $call, + $async.Future<$2.CreateSchemaRequest> $request) async { + return createSchema($call, await $request); + } + + $async.Future<$2.Schema> getSchema_Pre($grpc.ServiceCall $call, + $async.Future<$2.GetSchemaRequest> $request) async { + return getSchema($call, await $request); + } + + $async.Future<$2.ListSchemasResponse> listSchemas_Pre($grpc.ServiceCall $call, + $async.Future<$2.ListSchemasRequest> $request) async { + return listSchemas($call, await $request); + } + + $async.Future<$2.ListSchemaRevisionsResponse> listSchemaRevisions_Pre( + $grpc.ServiceCall $call, + $async.Future<$2.ListSchemaRevisionsRequest> $request) async { + return listSchemaRevisions($call, await $request); + } + + $async.Future<$2.Schema> commitSchema_Pre($grpc.ServiceCall $call, + $async.Future<$2.CommitSchemaRequest> $request) async { + return commitSchema($call, await $request); + } + + $async.Future<$2.Schema> rollbackSchema_Pre($grpc.ServiceCall $call, + $async.Future<$2.RollbackSchemaRequest> $request) async { + return rollbackSchema($call, await $request); + } + + $async.Future<$2.Schema> deleteSchemaRevision_Pre($grpc.ServiceCall $call, + $async.Future<$2.DeleteSchemaRevisionRequest> $request) async { + return deleteSchemaRevision($call, await $request); + } + + $async.Future<$1.Empty> deleteSchema_Pre($grpc.ServiceCall $call, + $async.Future<$2.DeleteSchemaRequest> $request) async { + return deleteSchema($call, await $request); + } + + $async.Future<$2.ValidateSchemaResponse> validateSchema_Pre( + $grpc.ServiceCall $call, + $async.Future<$2.ValidateSchemaRequest> $request) async { + return validateSchema($call, await $request); + } + + $async.Future<$2.ValidateMessageResponse> validateMessage_Pre( + $grpc.ServiceCall $call, + $async.Future<$2.ValidateMessageRequest> $request) async { + return validateMessage($call, await $request); + } + + $async.Future<$2.Schema> createSchema( + $grpc.ServiceCall call, $2.CreateSchemaRequest request); + $async.Future<$2.Schema> getSchema( + $grpc.ServiceCall call, $2.GetSchemaRequest request); + $async.Future<$2.ListSchemasResponse> listSchemas( + $grpc.ServiceCall call, $2.ListSchemasRequest request); + $async.Future<$2.ListSchemaRevisionsResponse> listSchemaRevisions( + $grpc.ServiceCall call, $2.ListSchemaRevisionsRequest request); + $async.Future<$2.Schema> commitSchema( + $grpc.ServiceCall call, $2.CommitSchemaRequest request); + $async.Future<$2.Schema> rollbackSchema( + $grpc.ServiceCall call, $2.RollbackSchemaRequest request); + $async.Future<$2.Schema> deleteSchemaRevision( + $grpc.ServiceCall call, $2.DeleteSchemaRevisionRequest request); + $async.Future<$1.Empty> deleteSchema( + $grpc.ServiceCall call, $2.DeleteSchemaRequest request); + $async.Future<$2.ValidateSchemaResponse> validateSchema( + $grpc.ServiceCall call, $2.ValidateSchemaRequest request); + $async.Future<$2.ValidateMessageResponse> validateMessage( + $grpc.ServiceCall call, $2.ValidateMessageRequest request); +} diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbjson.dart new file mode 100644 index 00000000..ecca624b --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbjson.dart @@ -0,0 +1,389 @@ +// +// Generated code. Do not modify. +// source: google/pubsub/v1/schema.proto +// +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use schemaViewDescriptor instead') +const SchemaView$json = { + '1': 'SchemaView', + '2': [ + {'1': 'SCHEMA_VIEW_UNSPECIFIED', '2': 0}, + {'1': 'BASIC', '2': 1}, + {'1': 'FULL', '2': 2}, + ], +}; + +/// Descriptor for `SchemaView`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List schemaViewDescriptor = $convert.base64Decode( + 'CgpTY2hlbWFWaWV3EhsKF1NDSEVNQV9WSUVXX1VOU1BFQ0lGSUVEEAASCQoFQkFTSUMQARIICg' + 'RGVUxMEAI='); + +@$core.Deprecated('Use encodingDescriptor instead') +const Encoding$json = { + '1': 'Encoding', + '2': [ + {'1': 'ENCODING_UNSPECIFIED', '2': 0}, + {'1': 'JSON', '2': 1}, + {'1': 'BINARY', '2': 2}, + ], +}; + +/// Descriptor for `Encoding`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List encodingDescriptor = $convert.base64Decode( + 'CghFbmNvZGluZxIYChRFTkNPRElOR19VTlNQRUNJRklFRBAAEggKBEpTT04QARIKCgZCSU5BUl' + 'kQAg=='); + +@$core.Deprecated('Use schemaDescriptor instead') +const Schema$json = { + '1': 'Schema', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + { + '1': 'type', + '3': 2, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.Schema.Type', + '10': 'type' + }, + {'1': 'definition', '3': 3, '4': 1, '5': 9, '10': 'definition'}, + {'1': 'revision_id', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'revisionId'}, + { + '1': 'revision_create_time', + '3': 6, + '4': 1, + '5': 11, + '6': '.google.protobuf.Timestamp', + '8': {}, + '10': 'revisionCreateTime' + }, + ], + '4': [Schema_Type$json], + '7': {}, +}; + +@$core.Deprecated('Use schemaDescriptor instead') +const Schema_Type$json = { + '1': 'Type', + '2': [ + {'1': 'TYPE_UNSPECIFIED', '2': 0}, + {'1': 'PROTOCOL_BUFFER', '2': 1}, + {'1': 'AVRO', '2': 2}, + ], +}; + +/// Descriptor for `Schema`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List schemaDescriptor = $convert.base64Decode( + 'CgZTY2hlbWESFwoEbmFtZRgBIAEoCUID4EECUgRuYW1lEjEKBHR5cGUYAiABKA4yHS5nb29nbG' + 'UucHVic3ViLnYxLlNjaGVtYS5UeXBlUgR0eXBlEh4KCmRlZmluaXRpb24YAyABKAlSCmRlZmlu' + 'aXRpb24SJwoLcmV2aXNpb25faWQYBCABKAlCBuBBBeBBA1IKcmV2aXNpb25JZBJRChRyZXZpc2' + 'lvbl9jcmVhdGVfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBA1IS' + 'cmV2aXNpb25DcmVhdGVUaW1lIjsKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhMKD1BST1' + 'RPQ09MX0JVRkZFUhABEggKBEFWUk8QAjpG6kFDChxwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU2No' + 'ZW1hEiNwcm9qZWN0cy97cHJvamVjdH0vc2NoZW1hcy97c2NoZW1hfQ=='); + +@$core.Deprecated('Use createSchemaRequestDescriptor instead') +const CreateSchemaRequest$json = { + '1': 'CreateSchemaRequest', + '2': [ + {'1': 'parent', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'parent'}, + { + '1': 'schema', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.Schema', + '8': {}, + '10': 'schema' + }, + {'1': 'schema_id', '3': 3, '4': 1, '5': 9, '10': 'schemaId'}, + ], +}; + +/// Descriptor for `CreateSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List createSchemaRequestDescriptor = $convert.base64Decode( + 'ChNDcmVhdGVTY2hlbWFSZXF1ZXN0EjwKBnBhcmVudBgBIAEoCUIk4EEC+kEeEhxwdWJzdWIuZ2' + '9vZ2xlYXBpcy5jb20vU2NoZW1hUgZwYXJlbnQSNQoGc2NoZW1hGAIgASgLMhguZ29vZ2xlLnB1' + 'YnN1Yi52MS5TY2hlbWFCA+BBAlIGc2NoZW1hEhsKCXNjaGVtYV9pZBgDIAEoCVIIc2NoZW1hSW' + 'Q='); + +@$core.Deprecated('Use getSchemaRequestDescriptor instead') +const GetSchemaRequest$json = { + '1': 'GetSchemaRequest', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + { + '1': 'view', + '3': 2, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.SchemaView', + '10': 'view' + }, + ], +}; + +/// Descriptor for `GetSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getSchemaRequestDescriptor = $convert.base64Decode( + 'ChBHZXRTY2hlbWFSZXF1ZXN0EjgKBG5hbWUYASABKAlCJOBBAvpBHgoccHVic3ViLmdvb2dsZW' + 'FwaXMuY29tL1NjaGVtYVIEbmFtZRIwCgR2aWV3GAIgASgOMhwuZ29vZ2xlLnB1YnN1Yi52MS5T' + 'Y2hlbWFWaWV3UgR2aWV3'); + +@$core.Deprecated('Use listSchemasRequestDescriptor instead') +const ListSchemasRequest$json = { + '1': 'ListSchemasRequest', + '2': [ + {'1': 'parent', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'parent'}, + { + '1': 'view', + '3': 2, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.SchemaView', + '10': 'view' + }, + {'1': 'page_size', '3': 3, '4': 1, '5': 5, '10': 'pageSize'}, + {'1': 'page_token', '3': 4, '4': 1, '5': 9, '10': 'pageToken'}, + ], +}; + +/// Descriptor for `ListSchemasRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listSchemasRequestDescriptor = $convert.base64Decode( + 'ChJMaXN0U2NoZW1hc1JlcXVlc3QSSwoGcGFyZW50GAEgASgJQjPgQQL6QS0KK2Nsb3VkcmVzb3' + 'VyY2VtYW5hZ2VyLmdvb2dsZWFwaXMuY29tL1Byb2plY3RSBnBhcmVudBIwCgR2aWV3GAIgASgO' + 'MhwuZ29vZ2xlLnB1YnN1Yi52MS5TY2hlbWFWaWV3UgR2aWV3EhsKCXBhZ2Vfc2l6ZRgDIAEoBV' + 'IIcGFnZVNpemUSHQoKcGFnZV90b2tlbhgEIAEoCVIJcGFnZVRva2Vu'); + +@$core.Deprecated('Use listSchemasResponseDescriptor instead') +const ListSchemasResponse$json = { + '1': 'ListSchemasResponse', + '2': [ + { + '1': 'schemas', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Schema', + '10': 'schemas' + }, + {'1': 'next_page_token', '3': 2, '4': 1, '5': 9, '10': 'nextPageToken'}, + ], +}; + +/// Descriptor for `ListSchemasResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listSchemasResponseDescriptor = $convert.base64Decode( + 'ChNMaXN0U2NoZW1hc1Jlc3BvbnNlEjIKB3NjaGVtYXMYASADKAsyGC5nb29nbGUucHVic3ViLn' + 'YxLlNjaGVtYVIHc2NoZW1hcxImCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAlSDW5leHRQYWdlVG9r' + 'ZW4='); + +@$core.Deprecated('Use listSchemaRevisionsRequestDescriptor instead') +const ListSchemaRevisionsRequest$json = { + '1': 'ListSchemaRevisionsRequest', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + { + '1': 'view', + '3': 2, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.SchemaView', + '10': 'view' + }, + {'1': 'page_size', '3': 3, '4': 1, '5': 5, '10': 'pageSize'}, + {'1': 'page_token', '3': 4, '4': 1, '5': 9, '10': 'pageToken'}, + ], +}; + +/// Descriptor for `ListSchemaRevisionsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listSchemaRevisionsRequestDescriptor = $convert.base64Decode( + 'ChpMaXN0U2NoZW1hUmV2aXNpb25zUmVxdWVzdBI4CgRuYW1lGAEgASgJQiTgQQL6QR4KHHB1Yn' + 'N1Yi5nb29nbGVhcGlzLmNvbS9TY2hlbWFSBG5hbWUSMAoEdmlldxgCIAEoDjIcLmdvb2dsZS5w' + 'dWJzdWIudjEuU2NoZW1hVmlld1IEdmlldxIbCglwYWdlX3NpemUYAyABKAVSCHBhZ2VTaXplEh' + '0KCnBhZ2VfdG9rZW4YBCABKAlSCXBhZ2VUb2tlbg=='); + +@$core.Deprecated('Use listSchemaRevisionsResponseDescriptor instead') +const ListSchemaRevisionsResponse$json = { + '1': 'ListSchemaRevisionsResponse', + '2': [ + { + '1': 'schemas', + '3': 1, + '4': 3, + '5': 11, + '6': '.google.pubsub.v1.Schema', + '10': 'schemas' + }, + {'1': 'next_page_token', '3': 2, '4': 1, '5': 9, '10': 'nextPageToken'}, + ], +}; + +/// Descriptor for `ListSchemaRevisionsResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listSchemaRevisionsResponseDescriptor = + $convert.base64Decode( + 'ChtMaXN0U2NoZW1hUmV2aXNpb25zUmVzcG9uc2USMgoHc2NoZW1hcxgBIAMoCzIYLmdvb2dsZS' + '5wdWJzdWIudjEuU2NoZW1hUgdzY2hlbWFzEiYKD25leHRfcGFnZV90b2tlbhgCIAEoCVINbmV4' + 'dFBhZ2VUb2tlbg=='); + +@$core.Deprecated('Use commitSchemaRequestDescriptor instead') +const CommitSchemaRequest$json = { + '1': 'CommitSchemaRequest', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + { + '1': 'schema', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.Schema', + '8': {}, + '10': 'schema' + }, + ], +}; + +/// Descriptor for `CommitSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List commitSchemaRequestDescriptor = $convert.base64Decode( + 'ChNDb21taXRTY2hlbWFSZXF1ZXN0EjgKBG5hbWUYASABKAlCJOBBAvpBHgoccHVic3ViLmdvb2' + 'dsZWFwaXMuY29tL1NjaGVtYVIEbmFtZRI1CgZzY2hlbWEYAiABKAsyGC5nb29nbGUucHVic3Vi' + 'LnYxLlNjaGVtYUID4EECUgZzY2hlbWE='); + +@$core.Deprecated('Use rollbackSchemaRequestDescriptor instead') +const RollbackSchemaRequest$json = { + '1': 'RollbackSchemaRequest', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + {'1': 'revision_id', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'revisionId'}, + ], +}; + +/// Descriptor for `RollbackSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List rollbackSchemaRequestDescriptor = $convert.base64Decode( + 'ChVSb2xsYmFja1NjaGVtYVJlcXVlc3QSOAoEbmFtZRgBIAEoCUIk4EEC+kEeChxwdWJzdWIuZ2' + '9vZ2xlYXBpcy5jb20vU2NoZW1hUgRuYW1lEiQKC3JldmlzaW9uX2lkGAIgASgJQgPgQQJSCnJl' + 'dmlzaW9uSWQ='); + +@$core.Deprecated('Use deleteSchemaRevisionRequestDescriptor instead') +const DeleteSchemaRevisionRequest$json = { + '1': 'DeleteSchemaRevisionRequest', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + { + '1': 'revision_id', + '3': 2, + '4': 1, + '5': 9, + '8': {'3': true}, + '10': 'revisionId', + }, + ], +}; + +/// Descriptor for `DeleteSchemaRevisionRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List deleteSchemaRevisionRequestDescriptor = + $convert.base64Decode( + 'ChtEZWxldGVTY2hlbWFSZXZpc2lvblJlcXVlc3QSOAoEbmFtZRgBIAEoCUIk4EEC+kEeChxwdW' + 'JzdWIuZ29vZ2xlYXBpcy5jb20vU2NoZW1hUgRuYW1lEiYKC3JldmlzaW9uX2lkGAIgASgJQgUY' + 'AeBBAVIKcmV2aXNpb25JZA=='); + +@$core.Deprecated('Use deleteSchemaRequestDescriptor instead') +const DeleteSchemaRequest$json = { + '1': 'DeleteSchemaRequest', + '2': [ + {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, + ], +}; + +/// Descriptor for `DeleteSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List deleteSchemaRequestDescriptor = $convert.base64Decode( + 'ChNEZWxldGVTY2hlbWFSZXF1ZXN0EjgKBG5hbWUYASABKAlCJOBBAvpBHgoccHVic3ViLmdvb2' + 'dsZWFwaXMuY29tL1NjaGVtYVIEbmFtZQ=='); + +@$core.Deprecated('Use validateSchemaRequestDescriptor instead') +const ValidateSchemaRequest$json = { + '1': 'ValidateSchemaRequest', + '2': [ + {'1': 'parent', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'parent'}, + { + '1': 'schema', + '3': 2, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.Schema', + '8': {}, + '10': 'schema' + }, + ], +}; + +/// Descriptor for `ValidateSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List validateSchemaRequestDescriptor = $convert.base64Decode( + 'ChVWYWxpZGF0ZVNjaGVtYVJlcXVlc3QSSwoGcGFyZW50GAEgASgJQjPgQQL6QS0KK2Nsb3Vkcm' + 'Vzb3VyY2VtYW5hZ2VyLmdvb2dsZWFwaXMuY29tL1Byb2plY3RSBnBhcmVudBI1CgZzY2hlbWEY' + 'AiABKAsyGC5nb29nbGUucHVic3ViLnYxLlNjaGVtYUID4EECUgZzY2hlbWE='); + +@$core.Deprecated('Use validateSchemaResponseDescriptor instead') +const ValidateSchemaResponse$json = { + '1': 'ValidateSchemaResponse', +}; + +/// Descriptor for `ValidateSchemaResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List validateSchemaResponseDescriptor = + $convert.base64Decode('ChZWYWxpZGF0ZVNjaGVtYVJlc3BvbnNl'); + +@$core.Deprecated('Use validateMessageRequestDescriptor instead') +const ValidateMessageRequest$json = { + '1': 'ValidateMessageRequest', + '2': [ + {'1': 'parent', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'parent'}, + {'1': 'name', '3': 2, '4': 1, '5': 9, '8': {}, '9': 0, '10': 'name'}, + { + '1': 'schema', + '3': 3, + '4': 1, + '5': 11, + '6': '.google.pubsub.v1.Schema', + '9': 0, + '10': 'schema' + }, + {'1': 'message', '3': 4, '4': 1, '5': 12, '10': 'message'}, + { + '1': 'encoding', + '3': 5, + '4': 1, + '5': 14, + '6': '.google.pubsub.v1.Encoding', + '10': 'encoding' + }, + ], + '8': [ + {'1': 'schema_spec'}, + ], +}; + +/// Descriptor for `ValidateMessageRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List validateMessageRequestDescriptor = $convert.base64Decode( + 'ChZWYWxpZGF0ZU1lc3NhZ2VSZXF1ZXN0EksKBnBhcmVudBgBIAEoCUIz4EEC+kEtCitjbG91ZH' + 'Jlc291cmNlbWFuYWdlci5nb29nbGVhcGlzLmNvbS9Qcm9qZWN0UgZwYXJlbnQSNwoEbmFtZRgC' + 'IAEoCUIh+kEeChxwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU2NoZW1hSABSBG5hbWUSMgoGc2NoZW' + '1hGAMgASgLMhguZ29vZ2xlLnB1YnN1Yi52MS5TY2hlbWFIAFIGc2NoZW1hEhgKB21lc3NhZ2UY' + 'BCABKAxSB21lc3NhZ2USNgoIZW5jb2RpbmcYBSABKA4yGi5nb29nbGUucHVic3ViLnYxLkVuY2' + '9kaW5nUghlbmNvZGluZ0INCgtzY2hlbWFfc3BlYw=='); + +@$core.Deprecated('Use validateMessageResponseDescriptor instead') +const ValidateMessageResponse$json = { + '1': 'ValidateMessageResponse', +}; + +/// Descriptor for `ValidateMessageResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List validateMessageResponseDescriptor = + $convert.base64Decode('ChdWYWxpZGF0ZU1lc3NhZ2VSZXNwb25zZQ=='); diff --git a/pkgs/google_cloud_pubsub/lib/src/message.dart b/pkgs/google_cloud_pubsub/lib/src/message.dart new file mode 100644 index 00000000..f1fe5374 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/message.dart @@ -0,0 +1,46 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// A Pub/Sub message. +final class Message { + /// The message data. + final List data; + + /// Optional attributes for this message. + final Map? attributes; + + /// The ID of this message, assigned by the server. + final String? messageId; + + /// The time at which the message was published. + final DateTime? publishTime; + + Message({ + required this.data, + this.attributes, + this.messageId, + this.publishTime, + }); +} + +/// A message received from a subscription. +final class ReceivedMessage { + /// The ack ID for this message. + final String ackId; + + /// The received message. + final Message message; + + ReceivedMessage({required this.ackId, required this.message}); +} diff --git a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart new file mode 100644 index 00000000..1b56525d --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart @@ -0,0 +1,88 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:ffi'; +import 'dart:io'; + +import 'package:ffi/ffi.dart'; +import 'package:meta/meta.dart'; + +final _getenv = DynamicLibrary.process() + .lookupFunction< + Pointer Function(Pointer), + Pointer Function(Pointer) + >('getenv'); + +final _getEnvironmentVariableW = DynamicLibrary.open('kernel32.dll') + .lookupFunction< + Int32 Function(Pointer, Pointer, Int32), + int Function(Pointer, Pointer, int) + >('GetEnvironmentVariableW'); + +String? _posixEnvironmentVariable(String name) => using((arena) { + final namePtr = name.toNativeUtf8(allocator: arena); + final valuePtr = _getenv(namePtr); + if (valuePtr == nullptr) { + return null; + } + return valuePtr.toDartString(); +}); + +String? _windowsEnvironmentVariable(String name) => using((arena) { + final namePtr = name.toNativeUtf16(allocator: arena); + // First call to determine size + final size = _getEnvironmentVariableW(namePtr, nullptr, 0); + if (size == 0) { + return null; // Error or empty. + } + + final buffer = arena(size).cast(); + final finalSize = _getEnvironmentVariableW(namePtr, buffer, size); + if (finalSize == 0 || finalSize > size) { + return null; // Error or race condition where variable grew? + } + return buffer.toDartString(); +}); + +String? _environmentVariable(String name) { + if (Platform.isWindows) { + return _windowsEnvironmentVariable(name); + } else { + return _posixEnvironmentVariable(name); + } +} + +/// The host and port of the Google Cloud Pub/Sub emulator, if set. +/// +/// Reads the `PUBSUB_EMULATOR_HOST` environment variable directly using native +/// code. [Platform.environment] is not used because it is cached and immutable +/// and the emulator configuration might not be available until the application +/// is launched. +@internal +String? get pubsubEmulatorHost { + final host = _environmentVariable('PUBSUB_EMULATOR_HOST'); + if (host?.isEmpty ?? true) return null; + return host; +} + +/// The project ID inferred from the environment. +/// +/// Reads the `GOOGLE_CLOUD_PROJECT` environment variable directly using native +/// code. +@internal +String? get projectFromEnvironment { + final project = _environmentVariable('GOOGLE_CLOUD_PROJECT'); + if (project?.isEmpty ?? true) return null; + return project; +} diff --git a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_web.dart b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_web.dart new file mode 100644 index 00000000..3cc74179 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_web.dart @@ -0,0 +1,27 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:meta/meta.dart'; + +/// The host and port of the Google Cloud Pub/Sub emulator, if set. +/// +/// Will never be set on the web. +@internal +String? get pubsubEmulatorHost => null; + +/// The project ID inferred from the environment. +/// +/// Will never be set on the web. +@internal +String? get projectFromEnvironment => null; diff --git a/pkgs/google_cloud_pubsub/lib/src/subscription.dart b/pkgs/google_cloud_pubsub/lib/src/subscription.dart new file mode 100644 index 00000000..5e32202e --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/subscription.dart @@ -0,0 +1,48 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:meta/meta.dart'; + +import '../google_cloud_pubsub.dart'; + +@internal +Subscription newSubscription(PubSub pubsub, String name) => + Subscription._(pubsub, name); + +/// A [Google Cloud Pub/Sub subscription](https://cloud.google.com/pubsub/docs/overview#subscriptions). +final class Subscription { + final PubSub pubsub; + final String name; + + Subscription._(this.pubsub, this.name); + + /// Creates this subscription. + Future create({required String topic}) => + pubsub.createSubscription(name, topic: topic); + + /// Deletes this subscription. + Future delete() => pubsub.deleteSubscription(name); + + /// Pulls messages from this subscription. + Future> pull({int maxMessages = 1}) => + pubsub.pull(name, maxMessages: maxMessages); + + /// Acknowledges messages. + Future acknowledge(List ackIds) => + pubsub.acknowledge(name, ackIds); + + /// Modifies the ack deadline for messages. + Future modifyAckDeadline(List ackIds, int ackDeadlineSeconds) => + pubsub.modifyAckDeadline(name, ackIds, ackDeadlineSeconds); +} diff --git a/pkgs/google_cloud_pubsub/lib/src/topic.dart b/pkgs/google_cloud_pubsub/lib/src/topic.dart new file mode 100644 index 00000000..cb84c0d6 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/topic.dart @@ -0,0 +1,41 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:meta/meta.dart'; + +import '../google_cloud_pubsub.dart'; + +@internal +Topic newTopic(PubSub pubsub, String name) => Topic._(pubsub, name); + +/// A [Google Cloud Pub/Sub topic](https://cloud.google.com/pubsub/docs/overview#topics). +final class Topic { + final PubSub pubsub; + final String name; + + Topic._(this.pubsub, this.name); + + /// Creates this topic. + Future create() => pubsub.createTopic(name); + + /// Deletes this topic. + Future delete() => pubsub.deleteTopic(name); + + /// Publishes a message to this topic. + /// + /// [data] is the message content. + /// [attributes] are optional attributes for the message. + Future publish(List data, {Map? attributes}) => + pubsub.publish(name, data, attributes: attributes); +} diff --git a/pkgs/google_cloud_pubsub/pubspec.yaml b/pkgs/google_cloud_pubsub/pubspec.yaml new file mode 100644 index 00000000..de9f273c --- /dev/null +++ b/pkgs/google_cloud_pubsub/pubspec.yaml @@ -0,0 +1,26 @@ +name: google_cloud_pubsub +description: >- + A client for Google Cloud Pub/Sub, a flexible, reliable, large-scale messaging + service. +version: 0.1.0 +repository: https://github.com/googleapis/google-cloud-dart/tree/main/pkgs/google_cloud_pubsub + +environment: + sdk: ^3.9.0 + +resolution: workspace + +dependencies: + collection: ^1.19.1 + ffi: ^2.2.0 + google_cloud: '>=0.3.0 <0.5.0' + google_cloud_protobuf: ^0.5.0 + google_cloud_rpc: ^0.5.0 + googleapis_auth: ^2.0.0 + grpc: ^4.0.0 + http: ^1.6.0 + meta: ^1.18.1 + protobuf: ^4.1.0 + +dev_dependencies: + test: ^1.24.0 diff --git a/pkgs/google_cloud_pubsub/test/client_test.dart b/pkgs/google_cloud_pubsub/test/client_test.dart new file mode 100644 index 00000000..ad99d12e --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/client_test.dart @@ -0,0 +1,28 @@ +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +void main() { + group('PubSub', () { + test('constructs with project ID', () async { + final client = PubSub(projectId: 'my-project'); + addTearDown(client.close); + expect(client, isNotNull); + }); + + test('topic returns a Topic instance', () { + final client = PubSub(projectId: 'my-project'); + addTearDown(client.close); + final topic = client.topic('my-topic'); + expect(topic, isNotNull); + expect(topic.name, 'my-topic'); + }); + + test('subscription returns a Subscription instance', () { + final client = PubSub(projectId: 'my-project'); + addTearDown(client.close); + final subscription = client.subscription('my-subscription'); + expect(subscription, isNotNull); + expect(subscription.name, 'my-subscription'); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart new file mode 100644 index 00000000..34811dbc --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -0,0 +1,40 @@ +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; +import 'dart:io'; +import 'dart:convert'; + +void main() { + group('PubSub Integration', () { + PubSub? client; + + setUp(() { + final host = Platform.environment['PUBSUB_EMULATOR_HOST']; + if (host == null) { + markTestSkipped('PUBSUB_EMULATOR_HOST environment variable not set'); + return; + } + client = PubSub(projectId: 'test-project'); + }); + + tearDown(() async { + await client?.close(); + }); + + test('create topic and publish message', () async { + if (client == null) return; // Skipped + + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + + // Create topic + await topic.create(); + + // Publish message + final messageId = await topic.publish(utf8.encode('Hello World')); + expect(messageId, isNotNull); + + // Delete topic + await topic.delete(); + }); + }); +} diff --git a/pubspec.yaml b/pubspec.yaml index f2929013..a1db789e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,7 @@ workspace: - generated/google_cloud_type - pkgs/google_cloud - pkgs/google_cloud_storage + - pkgs/google_cloud_pubsub - test_utils - tests From 4be47d9d9175c4c09f7137850e89af1ca1ce6a93 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Mon, 20 Apr 2026 10:27:25 +0000 Subject: [PATCH 02/18] Use grpc --- .../lib/google_cloud_pubsub.dart | 1 + pkgs/google_cloud_pubsub/lib/src/client.dart | 285 +- .../lib/src/exceptions.dart | 74 + .../google/protobuf/duration.pb.dart | 59 +- .../google/protobuf/duration.pbenum.dart | 13 +- .../google/protobuf/duration.pbjson.dart | 28 - .../generated/google/protobuf/empty.pb.dart | 33 +- .../google/protobuf/empty.pbenum.dart | 13 +- .../google/protobuf/empty.pbjson.dart | 23 - .../google/protobuf/field_mask.pb.dart | 45 +- .../google/protobuf/field_mask.pbenum.dart | 13 +- .../google/protobuf/field_mask.pbjson.dart | 26 - .../generated/google/protobuf/struct.pb.dart | 147 +- .../google/protobuf/struct.pbenum.dart | 18 +- .../google/protobuf/struct.pbjson.dart | 134 - .../google/protobuf/timestamp.pb.dart | 59 +- .../google/protobuf/timestamp.pbenum.dart | 13 +- .../google/protobuf/timestamp.pbjson.dart | 28 - .../generated/google/pubsub/v1/pubsub.pb.dart | 4230 +++++++---------- .../google/pubsub/v1/pubsub.pbenum.dart | 41 +- .../google/pubsub/v1/pubsub.pbgrpc.dart | 519 +- .../google/pubsub/v1/pubsub.pbjson.dart | 3139 ------------ .../generated/google/pubsub/v1/schema.pb.dart | 668 ++- .../google/pubsub/v1/schema.pbenum.dart | 22 +- .../google/pubsub/v1/schema.pbgrpc.dart | 338 +- .../google/pubsub/v1/schema.pbjson.dart | 389 -- .../lib/src/subscription.dart | 72 +- pkgs/google_cloud_pubsub/lib/src/topic.dart | 26 +- .../protos/google/api/annotations.proto | 31 + .../protos/google/api/client.proto | 598 +++ .../protos/google/api/field_behavior.proto | 104 + .../protos/google/api/http.proto | 370 ++ .../protos/google/api/launch_stage.proto | 72 + .../protos/google/api/resource.proto | 242 + .../protos/google/protobuf/duration.proto | 115 + .../protos/google/protobuf/empty.proto | 51 + .../protos/google/protobuf/field_mask.proto | 243 + .../protos/google/protobuf/struct.proto | 111 + .../protos/google/protobuf/timestamp.proto | 145 + .../protos/google/pubsub/v1/pubsub.proto | 2588 ++++++++++ .../protos/google/pubsub/v1/schema.proto | 409 ++ pkgs/google_cloud_pubsub/pubspec.yaml | 1 + .../test/integration_test.dart | 220 +- .../tool/compile_protos.dart | 44 + .../tool/fetch_protos.dart | 68 + .../tool/protoc-gen-dart.sh | 2 + 46 files changed, 8534 insertions(+), 7336 deletions(-) create mode 100644 pkgs/google_cloud_pubsub/lib/src/exceptions.dart delete mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbjson.dart delete mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbjson.dart delete mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbjson.dart delete mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbjson.dart delete mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbjson.dart delete mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbjson.dart delete mode 100644 pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbjson.dart create mode 100644 pkgs/google_cloud_pubsub/protos/google/api/annotations.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/api/client.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/api/field_behavior.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/api/http.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/api/launch_stage.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/api/resource.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/protobuf/duration.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/protobuf/empty.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/protobuf/field_mask.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/protobuf/struct.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/protobuf/timestamp.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/pubsub/v1/pubsub.proto create mode 100644 pkgs/google_cloud_pubsub/protos/google/pubsub/v1/schema.proto create mode 100644 pkgs/google_cloud_pubsub/tool/compile_protos.dart create mode 100644 pkgs/google_cloud_pubsub/tool/fetch_protos.dart create mode 100755 pkgs/google_cloud_pubsub/tool/protoc-gen-dart.sh diff --git a/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart b/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart index 500a6593..69062a1d 100644 --- a/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart +++ b/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart @@ -13,6 +13,7 @@ // limitations under the License. export 'src/client.dart' show PubSub; +export 'src/exceptions.dart'; export 'src/message.dart' show Message, ReceivedMessage; export 'src/subscription.dart' show Subscription; export 'src/topic.dart' show Topic; diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index e9e59c1c..e3494b71 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -14,6 +14,7 @@ import 'dart:async'; +import 'package:googleapis_auth/auth_io.dart' as auth; import 'package:grpc/grpc.dart'; import '../google_cloud_pubsub.dart'; import 'generated/google/pubsub/v1/pubsub.pbgrpc.dart' as grpc; @@ -28,8 +29,10 @@ import 'topic.dart' show newTopic; final class PubSub { final FutureOr _projectId; final ClientChannel _channel; + final bool _isEmulator; grpc.PublisherClient? _publisherClient; grpc.SubscriberClient? _subscriberClient; + auth.AutoRefreshingAuthClient? _authClient; Future get _requiredProjectId async { final id = await _projectId; @@ -84,7 +87,7 @@ final class PubSub { ); } - PubSub._(this._projectId, this._channel); + PubSub._(this._projectId, this._channel, this._isEmulator); /// Constructs a client used to communicate with [Google Cloud Pub/Sub][]. factory PubSub({String? projectId, String? apiEndpoint}) { @@ -92,9 +95,21 @@ final class PubSub { return PubSub._( _calculateProjectId(projectId, emulatorHost), _calculateChannel(apiEndpoint, emulatorHost), + emulatorHost != null, ); } + Future get _callOptions async { + if (_isEmulator) { + return CallOptions(); + } + _authClient ??= await auth.clientViaApplicationDefaultCredentials( + scopes: ['https://www.googleapis.com/auth/pubsub'], + ); + final token = _authClient!.credentials.accessToken.data; + return CallOptions(metadata: {'authorization': 'Bearer $token'}); + } + grpc.PublisherClient get _publisher => _publisherClient ??= grpc.PublisherClient(_channel); grpc.SubscriberClient get _subscriber => @@ -113,24 +128,52 @@ final class PubSub { /// A [Subscription] object with the given [name]. Subscription subscription(String name) => newSubscription(this, name); - /// Creates a new topic. + /// Creates the given topic with the given name. + /// + /// Throws a [TopicAlreadyExistsException] if the topic already exists. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.CreateTopic). Future createTopic(String name) async { final projectId = await _requiredProjectId; final topicName = 'projects/$projectId/topics/$name'; final topic = grpc.Topic()..name = topicName; - await _publisher.createTopic(topic); - return this.topic(name); + try { + await _publisher.createTopic(topic, options: await _callOptions); + return this.topic(name); + } on GrpcError catch (e) { + if (e.code == StatusCode.alreadyExists) { + throw TopicAlreadyExistsException(name); + } + rethrow; + } } - /// Deletes a topic. - Future deleteTopic(String name) async { + /// Deletes the topic with the given name. + /// + /// Returns `true` if the topic was deleted, or `false` if the topic did not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.DeleteTopic). + Future deleteTopic(String name) async { final projectId = await _requiredProjectId; final topicName = 'projects/$projectId/topics/$name'; final request = grpc.DeleteTopicRequest()..topic = topicName; - await _publisher.deleteTopic(request); + try { + await _publisher.deleteTopic(request, options: await _callOptions); + return true; + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + return false; + } + rethrow; + } } - /// Publishes a message to a topic. + /// Adds one or more messages to the topic. + /// + /// Throws a [TopicNotFoundException] if the topic does not exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.Publish). Future publish( String topicName, List data, { @@ -148,13 +191,38 @@ final class PubSub { ..topic = fullTopicName ..messages.add(message); - final response = await _publisher.publish(request); - return response.messageIds.first; + try { + final response = await _publisher.publish( + request, + options: await _callOptions, + ); + return response.messageIds.first; + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + throw TopicNotFoundException(topicName); + } + rethrow; + } } + // TODO(sigurdm): Implement missing Publisher APIs: + // - GetTopic + // - UpdateTopic + // - ListTopics + // - ListTopicSubscriptions + // - ListTopicSnapshots + // - DetachSubscription + // Subscription-related methods - /// Creates a new subscription. + /// Creates a subscription to a given topic. + /// + /// Throws a [SubscriptionAlreadyExistsException] if the subscription already + /// exists. + /// Throws a [TopicNotFoundException] if the corresponding topic doesn't + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.CreateSubscription). Future createSubscription( String name, { required String topic, @@ -167,20 +235,56 @@ final class PubSub { ..name = subscriptionName ..topic = topicName; - await _subscriber.createSubscription(subscription); - return this.subscription(name); + try { + await _subscriber.createSubscription( + subscription, + options: await _callOptions, + ); + return this.subscription(name); + } on GrpcError catch (e) { + if (e.code == StatusCode.alreadyExists) { + throw SubscriptionAlreadyExistsException(name); + } + if (e.code == StatusCode.notFound) { + throw TopicNotFoundException(topic); + } + rethrow; + } } - /// Deletes a subscription. - Future deleteSubscription(String name) async { + /// Deletes an existing subscription. + /// + /// All messages retained in the subscription are immediately dropped. + /// + /// Returns `true` if the subscription was deleted, or `false` if the + /// subscription did not exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.DeleteSubscription). + Future deleteSubscription(String name) async { final projectId = await _requiredProjectId; final subscriptionName = 'projects/$projectId/subscriptions/$name'; final request = grpc.DeleteSubscriptionRequest() ..subscription = subscriptionName; - await _subscriber.deleteSubscription(request); + try { + await _subscriber.deleteSubscription( + request, + options: await _callOptions, + ); + return true; + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + return false; + } + rethrow; + } } - /// Pulls messages from a subscription. + /// Pulls messages from the server. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Pull). Future> pull( String subscriptionName, { int maxMessages = 1, @@ -193,11 +297,72 @@ final class PubSub { ..subscription = fullSubscriptionName ..maxMessages = maxMessages; - final response = await _subscriber.pull(request); + try { + final response = await _subscriber.pull( + request, + options: await _callOptions, + ); - return response.receivedMessages - .map( - (m) => ReceivedMessage( + return response.receivedMessages + .map( + (m) => ReceivedMessage( + ackId: m.ackId, + message: Message( + data: m.message.data, + attributes: m.message.attributes, + messageId: m.message.messageId, + publishTime: m.message.publishTime.toDateTime(), + ), + ), + ) + .toList(); + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + throw SubscriptionNotFoundException(subscriptionName); + } + rethrow; + } + } + + /// Establishes a stream with the server, which sends messages down to the + /// client. + /// + /// The client streams acknowledgments and ack deadline modifications + /// back to the server. If an error occurs (including when the server closes + /// the stream with status `UNAVAILABLE` to reassign resources), the stream + /// will throw a [StreamBrokenException]. In this case, the caller should + /// re-establish the stream. Flow control can be achieved by configuring the + /// underlying RPC channel. + /// + /// Throws a [StreamBrokenException] if the stream is broken by the server or + /// network. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.StreamingPull). + Stream streamingPull( + String subscriptionName, { + int streamAckDeadlineSeconds = 10, + }) async* { + final projectId = await _requiredProjectId; + final fullSubscriptionName = + 'projects/$projectId/subscriptions/$subscriptionName'; + + final requestController = StreamController() + ..add( + grpc.StreamingPullRequest() + ..subscription = fullSubscriptionName + ..streamAckDeadlineSeconds = streamAckDeadlineSeconds, + ); + + // TODO(sigurdm): Retry on broken connections. + final responseStream = _subscriber.streamingPull( + requestController.stream, + options: await _callOptions, + ); + + try { + await for (final response in responseStream) { + for (final m in response.receivedMessages) { + yield ReceivedMessage( ackId: m.ackId, message: Message( data: m.message.data, @@ -205,12 +370,28 @@ final class PubSub { messageId: m.message.messageId, publishTime: m.message.publishTime.toDateTime(), ), - ), - ) - .toList(); + ); + } + } + } on GrpcError catch (e) { + throw StreamBrokenException(e); + } finally { + await requestController.close(); + } } - /// Acknowledges messages. + /// Acknowledges the messages associated with the `ack_ids`. + /// + /// The Pub/Sub system can remove the relevant messages from the subscription. + /// + /// Acknowledging a message whose ack deadline has expired may succeed, + /// but such a message may be redelivered later. Acknowledging a message more + /// than once will not result in an error. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Acknowledge). Future acknowledge(String subscriptionName, List ackIds) async { final projectId = await _requiredProjectId; final fullSubscriptionName = @@ -220,10 +401,27 @@ final class PubSub { ..subscription = fullSubscriptionName ..ackIds.addAll(ackIds); - await _subscriber.acknowledge(request); + try { + await _subscriber.acknowledge(request, options: await _callOptions); + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + throw SubscriptionNotFoundException(subscriptionName); + } + rethrow; + } } - /// Modifies the ack deadline for messages. + /// Modifies the ack deadline for a specific message. + /// + /// This method is useful to indicate that more time is needed to process a + /// message by the subscriber, or to make the message available for redelivery + /// if the processing was interrupted. Note that this does not modify the + /// subscription-level `ackDeadlineSeconds` used for subsequent messages. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.ModifyAckDeadline). Future modifyAckDeadline( String subscriptionName, List ackIds, @@ -238,6 +436,37 @@ final class PubSub { ..ackIds.addAll(ackIds) ..ackDeadlineSeconds = ackDeadlineSeconds; - await _subscriber.modifyAckDeadline(request); + try { + await _subscriber.modifyAckDeadline(request, options: await _callOptions); + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + throw SubscriptionNotFoundException(subscriptionName); + } + rethrow; + } } + + // TODO(sigurdm): Implement missing Subscriber APIs: + // - GetSubscription + // - UpdateSubscription + // - ListSubscriptions + // - ModifyPushConfig + // - GetSnapshot + // - ListSnapshots + // - CreateSnapshot + // - UpdateSnapshot + // - DeleteSnapshot + // - Seek + + // TODO(sigurdm): Implement missing Schema APIs: + // - CreateSchema + // - GetSchema + // - ListSchemas + // - ListSchemaRevisions + // - CommitSchema + // - RollbackSchema + // - DeleteSchemaRevision + // - DeleteSchema + // - ValidateSchema + // - ValidateMessage } diff --git a/pkgs/google_cloud_pubsub/lib/src/exceptions.dart b/pkgs/google_cloud_pubsub/lib/src/exceptions.dart new file mode 100644 index 00000000..491619b7 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/exceptions.dart @@ -0,0 +1,74 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:grpc/grpc.dart'; + +/// Thrown when a topic is not found. +class TopicNotFoundException implements Exception { + /// The name of the topic that was not found. + final String name; + + TopicNotFoundException(this.name); + + @override + String toString() => 'TopicNotFoundException: Topic "$name" not found.'; +} + +/// Thrown when a topic already exists. +class TopicAlreadyExistsException implements Exception { + /// The name of the topic that already exists. + final String name; + + TopicAlreadyExistsException(this.name); + + @override + String toString() => + 'TopicAlreadyExistsException: Topic "$name" already exists.'; +} + +/// Thrown when a subscription already exists. +class SubscriptionAlreadyExistsException implements Exception { + /// The name of the subscription that already exists. + final String name; + + SubscriptionAlreadyExistsException(this.name); + + @override + String toString() => + 'SubscriptionAlreadyExistsException: Subscription "$name" ' + 'already exists.'; +} + +/// Thrown when a subscription is not found. +class SubscriptionNotFoundException implements Exception { + /// The name of the subscription that was not found. + final String name; + + SubscriptionNotFoundException(this.name); + + @override + String toString() => + 'SubscriptionNotFoundException: Subscription "$name" not found.'; +} + +/// Thrown when a streaming pull connection is broken. +class StreamBrokenException implements Exception { + /// The underlying gRPC error that caused the stream to break. + final GrpcError error; + + StreamBrokenException(this.error); + + @override + String toString() => 'StreamBrokenException: ${error.message}'; +} diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pb.dart index 3c50c8e3..5cba2308 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pb.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pb.dart @@ -1,13 +1,15 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/duration.proto -// +// Generated from google/protobuf/duration.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; @@ -80,22 +82,20 @@ class Duration extends $pb.GeneratedMessage with $mixin.DurationMixin { $fixnum.Int64? seconds, $core.int? nanos, }) { - final $result = create(); - if (seconds != null) { - $result.seconds = seconds; - } - if (nanos != null) { - $result.nanos = nanos; - } - return $result; + final result = create(); + if (seconds != null) result.seconds = seconds; + if (nanos != null) result.nanos = nanos; + return result; } - Duration._() : super(); - factory Duration.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Duration.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + Duration._(); + + factory Duration.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Duration.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Duration', @@ -114,10 +114,12 @@ class Duration extends $pb.GeneratedMessage with $mixin.DurationMixin { Duration copyWith(void Function(Duration) updates) => super.copyWith((message) => updates(message as Duration)) as Duration; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Duration create() => Duration._(); + @$core.override Duration createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -131,10 +133,7 @@ class Duration extends $pb.GeneratedMessage with $mixin.DurationMixin { @$pb.TagNumber(1) $fixnum.Int64 get seconds => $_getI64(0); @$pb.TagNumber(1) - set seconds($fixnum.Int64 v) { - $_setInt64(0, v); - } - + set seconds($fixnum.Int64 value) => $_setInt64(0, value); @$pb.TagNumber(1) $core.bool hasSeconds() => $_has(0); @$pb.TagNumber(1) @@ -149,10 +148,7 @@ class Duration extends $pb.GeneratedMessage with $mixin.DurationMixin { @$pb.TagNumber(2) $core.int get nanos => $_getIZ(1); @$pb.TagNumber(2) - set nanos($core.int v) { - $_setSignedInt32(1, v); - } - + set nanos($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasNanos() => $_has(1); @$pb.TagNumber(2) @@ -174,6 +170,7 @@ class Duration extends $pb.GeneratedMessage with $mixin.DurationMixin { (duration.inMicroseconds % $core.Duration.microsecondsPerSecond) * 1000; } -const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbenum.dart index 431da01d..bc980256 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbenum.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbenum.dart @@ -1,10 +1,11 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/duration.proto -// +// Generated from google/protobuf/duration.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbjson.dart deleted file mode 100644 index 247421db..00000000 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/duration.pbjson.dart +++ /dev/null @@ -1,28 +0,0 @@ -// -// Generated code. Do not modify. -// source: google/protobuf/duration.proto -// -// @dart = 3.3 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:convert' as $convert; -import 'dart:core' as $core; -import 'dart:typed_data' as $typed_data; - -@$core.Deprecated('Use durationDescriptor instead') -const Duration$json = { - '1': 'Duration', - '2': [ - {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'}, - {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'}, - ], -}; - -/// Descriptor for `Duration`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List durationDescriptor = $convert.base64Decode( - 'CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW' - '5vcw=='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pb.dart index b81dae8a..0d803e08 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pb.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pb.dart @@ -1,13 +1,14 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/empty.proto -// +// Generated from google/protobuf/empty.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; @@ -24,13 +25,15 @@ export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; /// } class Empty extends $pb.GeneratedMessage { factory Empty() => create(); - Empty._() : super(); - factory Empty.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Empty.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + Empty._(); + + factory Empty.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Empty.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Empty', @@ -45,10 +48,12 @@ class Empty extends $pb.GeneratedMessage { Empty copyWith(void Function(Empty) updates) => super.copyWith((message) => updates(message as Empty)) as Empty; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Empty create() => Empty._(); + @$core.override Empty createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -57,5 +62,5 @@ class Empty extends $pb.GeneratedMessage { static Empty? _defaultInstance; } -const _omitMessageNames = +const $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbenum.dart index dfb634ba..0573bd5a 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbenum.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbenum.dart @@ -1,10 +1,11 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/empty.proto -// +// Generated from google/protobuf/empty.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbjson.dart deleted file mode 100644 index 9a264728..00000000 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/empty.pbjson.dart +++ /dev/null @@ -1,23 +0,0 @@ -// -// Generated code. Do not modify. -// source: google/protobuf/empty.proto -// -// @dart = 3.3 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:convert' as $convert; -import 'dart:core' as $core; -import 'dart:typed_data' as $typed_data; - -@$core.Deprecated('Use emptyDescriptor instead') -const Empty$json = { - '1': 'Empty', -}; - -/// Descriptor for `Empty`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List emptyDescriptor = - $convert.base64Decode('CgVFbXB0eQ=='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pb.dart index 1771e286..ccfaf1c7 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pb.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pb.dart @@ -1,13 +1,15 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/field_mask.proto -// +// Generated from google/protobuf/field_mask.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; @@ -217,19 +219,19 @@ class FieldMask extends $pb.GeneratedMessage with $mixin.FieldMaskMixin { factory FieldMask({ $core.Iterable<$core.String>? paths, }) { - final $result = create(); - if (paths != null) { - $result.paths.addAll(paths); - } - return $result; + final result = create(); + if (paths != null) result.paths.addAll(paths); + return result; } - FieldMask._() : super(); - factory FieldMask.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory FieldMask.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + FieldMask._(); + + factory FieldMask.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory FieldMask.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'FieldMask', @@ -247,10 +249,12 @@ class FieldMask extends $pb.GeneratedMessage with $mixin.FieldMaskMixin { FieldMask copyWith(void Function(FieldMask) updates) => super.copyWith((message) => updates(message as FieldMask)) as FieldMask; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static FieldMask create() => FieldMask._(); + @$core.override FieldMask createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -263,6 +267,7 @@ class FieldMask extends $pb.GeneratedMessage with $mixin.FieldMaskMixin { $pb.PbList<$core.String> get paths => $_getList(0); } -const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbenum.dart index c357b68b..bccc4ef6 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbenum.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbenum.dart @@ -1,10 +1,11 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/field_mask.proto -// +// Generated from google/protobuf/field_mask.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbjson.dart deleted file mode 100644 index 311d2c1a..00000000 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/field_mask.pbjson.dart +++ /dev/null @@ -1,26 +0,0 @@ -// -// Generated code. Do not modify. -// source: google/protobuf/field_mask.proto -// -// @dart = 3.3 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:convert' as $convert; -import 'dart:core' as $core; -import 'dart:typed_data' as $typed_data; - -@$core.Deprecated('Use fieldMaskDescriptor instead') -const FieldMask$json = { - '1': 'FieldMask', - '2': [ - {'1': 'paths', '3': 1, '4': 3, '5': 9, '10': 'paths'}, - ], -}; - -/// Descriptor for `FieldMask`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List fieldMaskDescriptor = - $convert.base64Decode('CglGaWVsZE1hc2sSFAoFcGF0aHMYASADKAlSBXBhdGhz'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pb.dart index 63112a6a..2588a95e 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pb.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pb.dart @@ -1,13 +1,15 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/struct.proto -// +// Generated from google/protobuf/struct.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; @@ -37,19 +39,19 @@ class Struct extends $pb.GeneratedMessage with $mixin.StructMixin { factory Struct({ $core.Iterable<$core.MapEntry<$core.String, Value>>? fields, }) { - final $result = create(); - if (fields != null) { - $result.fields.addEntries(fields); - } - return $result; + final result = create(); + if (fields != null) result.fields.addEntries(fields); + return result; } - Struct._() : super(); - factory Struct.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Struct.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + Struct._(); + + factory Struct.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Struct.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Struct', @@ -73,10 +75,12 @@ class Struct extends $pb.GeneratedMessage with $mixin.StructMixin { Struct copyWith(void Function(Struct) updates) => super.copyWith((message) => updates(message as Struct)) as Struct; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Struct create() => Struct._(); + @$core.override Struct createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -114,34 +118,24 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { Struct? structValue, ListValue? listValue, }) { - final $result = create(); - if (nullValue != null) { - $result.nullValue = nullValue; - } - if (numberValue != null) { - $result.numberValue = numberValue; - } - if (stringValue != null) { - $result.stringValue = stringValue; - } - if (boolValue != null) { - $result.boolValue = boolValue; - } - if (structValue != null) { - $result.structValue = structValue; - } - if (listValue != null) { - $result.listValue = listValue; - } - return $result; + final result = create(); + if (nullValue != null) result.nullValue = nullValue; + if (numberValue != null) result.numberValue = numberValue; + if (stringValue != null) result.stringValue = stringValue; + if (boolValue != null) result.boolValue = boolValue; + if (structValue != null) result.structValue = structValue; + if (listValue != null) result.listValue = listValue; + return result; } - Value._() : super(); - factory Value.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Value.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + Value._(); + + factory Value.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Value.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, Value_Kind> _Value_KindByTag = { 1: Value_Kind.nullValue, @@ -180,10 +174,12 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { Value copyWith(void Function(Value) updates) => super.copyWith((message) => updates(message as Value)) as Value; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Value create() => Value._(); + @$core.override Value createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -198,10 +194,7 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { @$pb.TagNumber(1) NullValue get nullValue => $_getN(0); @$pb.TagNumber(1) - set nullValue(NullValue v) { - $_setField(1, v); - } - + set nullValue(NullValue value) => $_setField(1, value); @$pb.TagNumber(1) $core.bool hasNullValue() => $_has(0); @$pb.TagNumber(1) @@ -214,10 +207,7 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { @$pb.TagNumber(2) $core.double get numberValue => $_getN(1); @$pb.TagNumber(2) - set numberValue($core.double v) { - $_setDouble(1, v); - } - + set numberValue($core.double value) => $_setDouble(1, value); @$pb.TagNumber(2) $core.bool hasNumberValue() => $_has(1); @$pb.TagNumber(2) @@ -227,10 +217,7 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { @$pb.TagNumber(3) $core.String get stringValue => $_getSZ(2); @$pb.TagNumber(3) - set stringValue($core.String v) { - $_setString(2, v); - } - + set stringValue($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasStringValue() => $_has(2); @$pb.TagNumber(3) @@ -240,10 +227,7 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { @$pb.TagNumber(4) $core.bool get boolValue => $_getBF(3); @$pb.TagNumber(4) - set boolValue($core.bool v) { - $_setBool(3, v); - } - + set boolValue($core.bool value) => $_setBool(3, value); @$pb.TagNumber(4) $core.bool hasBoolValue() => $_has(3); @$pb.TagNumber(4) @@ -253,10 +237,7 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { @$pb.TagNumber(5) Struct get structValue => $_getN(4); @$pb.TagNumber(5) - set structValue(Struct v) { - $_setField(5, v); - } - + set structValue(Struct value) => $_setField(5, value); @$pb.TagNumber(5) $core.bool hasStructValue() => $_has(4); @$pb.TagNumber(5) @@ -268,10 +249,7 @@ class Value extends $pb.GeneratedMessage with $mixin.ValueMixin { @$pb.TagNumber(6) ListValue get listValue => $_getN(5); @$pb.TagNumber(6) - set listValue(ListValue v) { - $_setField(6, v); - } - + set listValue(ListValue value) => $_setField(6, value); @$pb.TagNumber(6) $core.bool hasListValue() => $_has(5); @$pb.TagNumber(6) @@ -285,19 +263,19 @@ class ListValue extends $pb.GeneratedMessage with $mixin.ListValueMixin { factory ListValue({ $core.Iterable? values, }) { - final $result = create(); - if (values != null) { - $result.values.addAll(values); - } - return $result; + final result = create(); + if (values != null) result.values.addAll(values); + return result; } - ListValue._() : super(); - factory ListValue.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListValue.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListValue._(); + + factory ListValue.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListValue.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListValue', @@ -316,10 +294,12 @@ class ListValue extends $pb.GeneratedMessage with $mixin.ListValueMixin { ListValue copyWith(void Function(ListValue) updates) => super.copyWith((message) => updates(message as ListValue)) as ListValue; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListValue create() => ListValue._(); + @$core.override ListValue createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -332,6 +312,7 @@ class ListValue extends $pb.GeneratedMessage with $mixin.ListValueMixin { $pb.PbList get values => $_getList(0); } -const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbenum.dart index 23027236..87ee17cf 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbenum.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbenum.dart @@ -1,13 +1,14 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/struct.proto -// +// Generated from google/protobuf/struct.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; @@ -36,7 +37,8 @@ class NullValue extends $pb.ProtobufEnum { static NullValue? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const NullValue._(super.v, super.n); + const NullValue._(super.value, super.name); } -const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names'); +const $core.bool _omitEnumNames = + $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbjson.dart deleted file mode 100644 index 36967b55..00000000 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/struct.pbjson.dart +++ /dev/null @@ -1,134 +0,0 @@ -// -// Generated code. Do not modify. -// source: google/protobuf/struct.proto -// -// @dart = 3.3 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:convert' as $convert; -import 'dart:core' as $core; -import 'dart:typed_data' as $typed_data; - -@$core.Deprecated('Use nullValueDescriptor instead') -const NullValue$json = { - '1': 'NullValue', - '2': [ - {'1': 'NULL_VALUE', '2': 0}, - ], -}; - -/// Descriptor for `NullValue`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List nullValueDescriptor = - $convert.base64Decode('CglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAA'); - -@$core.Deprecated('Use structDescriptor instead') -const Struct$json = { - '1': 'Struct', - '2': [ - { - '1': 'fields', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.protobuf.Struct.FieldsEntry', - '10': 'fields' - }, - ], - '3': [Struct_FieldsEntry$json], -}; - -@$core.Deprecated('Use structDescriptor instead') -const Struct_FieldsEntry$json = { - '1': 'FieldsEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - { - '1': 'value', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.protobuf.Value', - '10': 'value' - }, - ], - '7': {'7': true}, -}; - -/// Descriptor for `Struct`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List structDescriptor = $convert.base64Decode( - 'CgZTdHJ1Y3QSOwoGZmllbGRzGAEgAygLMiMuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZH' - 'NFbnRyeVIGZmllbGRzGlEKC0ZpZWxkc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVl' - 'GAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAE='); - -@$core.Deprecated('Use valueDescriptor instead') -const Value$json = { - '1': 'Value', - '2': [ - { - '1': 'null_value', - '3': 1, - '4': 1, - '5': 14, - '6': '.google.protobuf.NullValue', - '9': 0, - '10': 'nullValue' - }, - {'1': 'number_value', '3': 2, '4': 1, '5': 1, '9': 0, '10': 'numberValue'}, - {'1': 'string_value', '3': 3, '4': 1, '5': 9, '9': 0, '10': 'stringValue'}, - {'1': 'bool_value', '3': 4, '4': 1, '5': 8, '9': 0, '10': 'boolValue'}, - { - '1': 'struct_value', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.protobuf.Struct', - '9': 0, - '10': 'structValue' - }, - { - '1': 'list_value', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.protobuf.ListValue', - '9': 0, - '10': 'listValue' - }, - ], - '8': [ - {'1': 'kind'}, - ], -}; - -/// Descriptor for `Value`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List valueDescriptor = $convert.base64Decode( - 'CgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZU' - 'gAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0' - 'cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCW' - 'Jvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0' - 'SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTG' - 'lzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5k'); - -@$core.Deprecated('Use listValueDescriptor instead') -const ListValue$json = { - '1': 'ListValue', - '2': [ - { - '1': 'values', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.protobuf.Value', - '10': 'values' - }, - ], -}; - -/// Descriptor for `ListValue`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listValueDescriptor = $convert.base64Decode( - 'CglMaXN0VmFsdWUSLgoGdmFsdWVzGAEgAygLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgZ2YW' - 'x1ZXM='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pb.dart index bb72f183..3cffdba3 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pb.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pb.dart @@ -1,13 +1,15 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/timestamp.proto -// +// Generated from google/protobuf/timestamp.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; @@ -111,22 +113,20 @@ class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { $fixnum.Int64? seconds, $core.int? nanos, }) { - final $result = create(); - if (seconds != null) { - $result.seconds = seconds; - } - if (nanos != null) { - $result.nanos = nanos; - } - return $result; + final result = create(); + if (seconds != null) result.seconds = seconds; + if (nanos != null) result.nanos = nanos; + return result; } - Timestamp._() : super(); - factory Timestamp.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Timestamp.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + Timestamp._(); + + factory Timestamp.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Timestamp.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Timestamp', @@ -145,10 +145,12 @@ class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { Timestamp copyWith(void Function(Timestamp) updates) => super.copyWith((message) => updates(message as Timestamp)) as Timestamp; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Timestamp create() => Timestamp._(); + @$core.override Timestamp createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -162,10 +164,7 @@ class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { @$pb.TagNumber(1) $fixnum.Int64 get seconds => $_getI64(0); @$pb.TagNumber(1) - set seconds($fixnum.Int64 v) { - $_setInt64(0, v); - } - + set seconds($fixnum.Int64 value) => $_setInt64(0, value); @$pb.TagNumber(1) $core.bool hasSeconds() => $_has(0); @$pb.TagNumber(1) @@ -179,10 +178,7 @@ class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { @$pb.TagNumber(2) $core.int get nanos => $_getIZ(1); @$pb.TagNumber(2) - set nanos($core.int v) { - $_setSignedInt32(1, v); - } - + set nanos($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasNanos() => $_has(1); @$pb.TagNumber(2) @@ -198,6 +194,7 @@ class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin { } } -const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbenum.dart index 1eaa8d17..f952d36b 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbenum.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbenum.dart @@ -1,10 +1,11 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/protobuf/timestamp.proto -// +// Generated from google/protobuf/timestamp.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbjson.dart deleted file mode 100644 index 2fc1450f..00000000 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/protobuf/timestamp.pbjson.dart +++ /dev/null @@ -1,28 +0,0 @@ -// -// Generated code. Do not modify. -// source: google/protobuf/timestamp.proto -// -// @dart = 3.3 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:convert' as $convert; -import 'dart:core' as $core; -import 'dart:typed_data' as $typed_data; - -@$core.Deprecated('Use timestampDescriptor instead') -const Timestamp$json = { - '1': 'Timestamp', - '2': [ - {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'}, - {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'}, - ], -}; - -/// Descriptor for `Timestamp`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List timestampDescriptor = $convert.base64Decode( - 'CglUaW1lc3RhbXASGAoHc2Vjb25kcxgBIAEoA1IHc2Vjb25kcxIUCgVuYW5vcxgCIAEoBVIFbm' - 'Fub3M='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pb.dart index 11ac91e5..1ecf348b 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pb.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pb.dart @@ -1,25 +1,26 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/pubsub/v1/pubsub.proto -// +// Generated from google/pubsub/v1/pubsub.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; import 'package:fixnum/fixnum.dart' as $fixnum; import 'package:protobuf/protobuf.dart' as $pb; -import '../../protobuf/duration.pb.dart' as $5; -import '../../protobuf/field_mask.pb.dart' as $6; -import '../../protobuf/struct.pb.dart' as $4; -import '../../protobuf/timestamp.pb.dart' as $3; +import '../../protobuf/duration.pb.dart' as $4; +import '../../protobuf/field_mask.pb.dart' as $5; +import '../../protobuf/struct.pb.dart' as $3; +import '../../protobuf/timestamp.pb.dart' as $2; import 'pubsub.pbenum.dart'; -import 'schema.pbenum.dart' as $2; +import 'schema.pbenum.dart' as $6; export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; @@ -31,22 +32,21 @@ class MessageStoragePolicy extends $pb.GeneratedMessage { $core.Iterable<$core.String>? allowedPersistenceRegions, $core.bool? enforceInTransit, }) { - final $result = create(); - if (allowedPersistenceRegions != null) { - $result.allowedPersistenceRegions.addAll(allowedPersistenceRegions); - } - if (enforceInTransit != null) { - $result.enforceInTransit = enforceInTransit; - } - return $result; + final result = create(); + if (allowedPersistenceRegions != null) + result.allowedPersistenceRegions.addAll(allowedPersistenceRegions); + if (enforceInTransit != null) result.enforceInTransit = enforceInTransit; + return result; } - MessageStoragePolicy._() : super(); - factory MessageStoragePolicy.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory MessageStoragePolicy.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + MessageStoragePolicy._(); + + factory MessageStoragePolicy.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory MessageStoragePolicy.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'MessageStoragePolicy', @@ -65,10 +65,12 @@ class MessageStoragePolicy extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as MessageStoragePolicy)) as MessageStoragePolicy; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static MessageStoragePolicy create() => MessageStoragePolicy._(); + @$core.override MessageStoragePolicy createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -94,10 +96,7 @@ class MessageStoragePolicy extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.bool get enforceInTransit => $_getBF(1); @$pb.TagNumber(2) - set enforceInTransit($core.bool v) { - $_setBool(1, v); - } - + set enforceInTransit($core.bool value) => $_setBool(1, value); @$pb.TagNumber(2) $core.bool hasEnforceInTransit() => $_has(1); @$pb.TagNumber(2) @@ -108,32 +107,26 @@ class MessageStoragePolicy extends $pb.GeneratedMessage { class SchemaSettings extends $pb.GeneratedMessage { factory SchemaSettings({ $core.String? schema, - $2.Encoding? encoding, + $6.Encoding? encoding, $core.String? firstRevisionId, $core.String? lastRevisionId, }) { - final $result = create(); - if (schema != null) { - $result.schema = schema; - } - if (encoding != null) { - $result.encoding = encoding; - } - if (firstRevisionId != null) { - $result.firstRevisionId = firstRevisionId; - } - if (lastRevisionId != null) { - $result.lastRevisionId = lastRevisionId; - } - return $result; + final result = create(); + if (schema != null) result.schema = schema; + if (encoding != null) result.encoding = encoding; + if (firstRevisionId != null) result.firstRevisionId = firstRevisionId; + if (lastRevisionId != null) result.lastRevisionId = lastRevisionId; + return result; } - SchemaSettings._() : super(); - factory SchemaSettings.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory SchemaSettings.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + SchemaSettings._(); + + factory SchemaSettings.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SchemaSettings.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'SchemaSettings', @@ -141,10 +134,10 @@ class SchemaSettings extends $pb.GeneratedMessage { const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), createEmptyInstance: create) ..aOS(1, _omitFieldNames ? '' : 'schema') - ..e<$2.Encoding>(2, _omitFieldNames ? '' : 'encoding', $pb.PbFieldType.OE, - defaultOrMaker: $2.Encoding.ENCODING_UNSPECIFIED, - valueOf: $2.Encoding.valueOf, - enumValues: $2.Encoding.values) + ..e<$6.Encoding>(2, _omitFieldNames ? '' : 'encoding', $pb.PbFieldType.OE, + defaultOrMaker: $6.Encoding.ENCODING_UNSPECIFIED, + valueOf: $6.Encoding.valueOf, + enumValues: $6.Encoding.values) ..aOS(3, _omitFieldNames ? '' : 'firstRevisionId') ..aOS(4, _omitFieldNames ? '' : 'lastRevisionId') ..hasRequiredFields = false; @@ -156,10 +149,12 @@ class SchemaSettings extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as SchemaSettings)) as SchemaSettings; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SchemaSettings create() => SchemaSettings._(); + @$core.override SchemaSettings createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -175,10 +170,7 @@ class SchemaSettings extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get schema => $_getSZ(0); @$pb.TagNumber(1) - set schema($core.String v) { - $_setString(0, v); - } - + set schema($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSchema() => $_has(0); @$pb.TagNumber(1) @@ -186,12 +178,9 @@ class SchemaSettings extends $pb.GeneratedMessage { /// Optional. The encoding of messages validated against `schema`. @$pb.TagNumber(2) - $2.Encoding get encoding => $_getN(1); + $6.Encoding get encoding => $_getN(1); @$pb.TagNumber(2) - set encoding($2.Encoding v) { - $_setField(2, v); - } - + set encoding($6.Encoding value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasEncoding() => $_has(1); @$pb.TagNumber(2) @@ -203,10 +192,7 @@ class SchemaSettings extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get firstRevisionId => $_getSZ(2); @$pb.TagNumber(3) - set firstRevisionId($core.String v) { - $_setString(2, v); - } - + set firstRevisionId($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasFirstRevisionId() => $_has(2); @$pb.TagNumber(3) @@ -218,10 +204,7 @@ class SchemaSettings extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get lastRevisionId => $_getSZ(3); @$pb.TagNumber(4) - set lastRevisionId($core.String v) { - $_setString(3, v); - } - + set lastRevisionId($core.String value) => $_setString(3, value); @$pb.TagNumber(4) $core.bool hasLastRevisionId() => $_has(3); @$pb.TagNumber(4) @@ -237,32 +220,24 @@ class IngestionDataSourceSettings_AwsKinesis extends $pb.GeneratedMessage { $core.String? awsRoleArn, $core.String? gcpServiceAccount, }) { - final $result = create(); - if (state != null) { - $result.state = state; - } - if (streamArn != null) { - $result.streamArn = streamArn; - } - if (consumerArn != null) { - $result.consumerArn = consumerArn; - } - if (awsRoleArn != null) { - $result.awsRoleArn = awsRoleArn; - } - if (gcpServiceAccount != null) { - $result.gcpServiceAccount = gcpServiceAccount; - } - return $result; + final result = create(); + if (state != null) result.state = state; + if (streamArn != null) result.streamArn = streamArn; + if (consumerArn != null) result.consumerArn = consumerArn; + if (awsRoleArn != null) result.awsRoleArn = awsRoleArn; + if (gcpServiceAccount != null) result.gcpServiceAccount = gcpServiceAccount; + return result; } - IngestionDataSourceSettings_AwsKinesis._() : super(); + + IngestionDataSourceSettings_AwsKinesis._(); + factory IngestionDataSourceSettings_AwsKinesis.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionDataSourceSettings_AwsKinesis.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionDataSourceSettings_AwsKinesis.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'IngestionDataSourceSettings.AwsKinesis', @@ -291,11 +266,13 @@ class IngestionDataSourceSettings_AwsKinesis extends $pb.GeneratedMessage { updates(message as IngestionDataSourceSettings_AwsKinesis)) as IngestionDataSourceSettings_AwsKinesis; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings_AwsKinesis create() => IngestionDataSourceSettings_AwsKinesis._(); + @$core.override IngestionDataSourceSettings_AwsKinesis createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -310,10 +287,8 @@ class IngestionDataSourceSettings_AwsKinesis extends $pb.GeneratedMessage { @$pb.TagNumber(1) IngestionDataSourceSettings_AwsKinesis_State get state => $_getN(0); @$pb.TagNumber(1) - set state(IngestionDataSourceSettings_AwsKinesis_State v) { - $_setField(1, v); - } - + set state(IngestionDataSourceSettings_AwsKinesis_State value) => + $_setField(1, value); @$pb.TagNumber(1) $core.bool hasState() => $_has(0); @$pb.TagNumber(1) @@ -323,10 +298,7 @@ class IngestionDataSourceSettings_AwsKinesis extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get streamArn => $_getSZ(1); @$pb.TagNumber(2) - set streamArn($core.String v) { - $_setString(1, v); - } - + set streamArn($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasStreamArn() => $_has(1); @$pb.TagNumber(2) @@ -337,10 +309,7 @@ class IngestionDataSourceSettings_AwsKinesis extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get consumerArn => $_getSZ(2); @$pb.TagNumber(3) - set consumerArn($core.String v) { - $_setString(2, v); - } - + set consumerArn($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasConsumerArn() => $_has(2); @$pb.TagNumber(3) @@ -352,10 +321,7 @@ class IngestionDataSourceSettings_AwsKinesis extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get awsRoleArn => $_getSZ(3); @$pb.TagNumber(4) - set awsRoleArn($core.String v) { - $_setString(3, v); - } - + set awsRoleArn($core.String value) => $_setString(3, value); @$pb.TagNumber(4) $core.bool hasAwsRoleArn() => $_has(3); @$pb.TagNumber(4) @@ -368,10 +334,7 @@ class IngestionDataSourceSettings_AwsKinesis extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.String get gcpServiceAccount => $_getSZ(4); @$pb.TagNumber(5) - set gcpServiceAccount($core.String v) { - $_setString(4, v); - } - + set gcpServiceAccount($core.String value) => $_setString(4, value); @$pb.TagNumber(5) $core.bool hasGcpServiceAccount() => $_has(4); @$pb.TagNumber(5) @@ -386,21 +349,21 @@ class IngestionDataSourceSettings_CloudStorage_TextFormat factory IngestionDataSourceSettings_CloudStorage_TextFormat({ $core.String? delimiter, }) { - final $result = create(); - if (delimiter != null) { - $result.delimiter = delimiter; - } - return $result; + final result = create(); + if (delimiter != null) result.delimiter = delimiter; + return result; } - IngestionDataSourceSettings_CloudStorage_TextFormat._() : super(); + + IngestionDataSourceSettings_CloudStorage_TextFormat._(); + factory IngestionDataSourceSettings_CloudStorage_TextFormat.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); factory IngestionDataSourceSettings_CloudStorage_TextFormat.fromJson( - $core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames @@ -424,11 +387,13 @@ class IngestionDataSourceSettings_CloudStorage_TextFormat message as IngestionDataSourceSettings_CloudStorage_TextFormat)) as IngestionDataSourceSettings_CloudStorage_TextFormat; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings_CloudStorage_TextFormat create() => IngestionDataSourceSettings_CloudStorage_TextFormat._(); + @$core.override IngestionDataSourceSettings_CloudStorage_TextFormat createEmptyInstance() => create(); static $pb.PbList @@ -444,10 +409,7 @@ class IngestionDataSourceSettings_CloudStorage_TextFormat @$pb.TagNumber(1) $core.String get delimiter => $_getSZ(0); @$pb.TagNumber(1) - set delimiter($core.String v) { - $_setString(0, v); - } - + set delimiter($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasDelimiter() => $_has(0); @$pb.TagNumber(1) @@ -460,15 +422,17 @@ class IngestionDataSourceSettings_CloudStorage_TextFormat class IngestionDataSourceSettings_CloudStorage_AvroFormat extends $pb.GeneratedMessage { factory IngestionDataSourceSettings_CloudStorage_AvroFormat() => create(); - IngestionDataSourceSettings_CloudStorage_AvroFormat._() : super(); + + IngestionDataSourceSettings_CloudStorage_AvroFormat._(); + factory IngestionDataSourceSettings_CloudStorage_AvroFormat.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); factory IngestionDataSourceSettings_CloudStorage_AvroFormat.fromJson( - $core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames @@ -491,11 +455,13 @@ class IngestionDataSourceSettings_CloudStorage_AvroFormat message as IngestionDataSourceSettings_CloudStorage_AvroFormat)) as IngestionDataSourceSettings_CloudStorage_AvroFormat; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings_CloudStorage_AvroFormat create() => IngestionDataSourceSettings_CloudStorage_AvroFormat._(); + @$core.override IngestionDataSourceSettings_CloudStorage_AvroFormat createEmptyInstance() => create(); static $pb.PbList @@ -516,15 +482,17 @@ class IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat extends $pb.GeneratedMessage { factory IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat() => create(); - IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat._() : super(); + + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat._(); + factory IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); factory IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat.fromJson( - $core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames @@ -548,11 +516,13 @@ class IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat as IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat)) as IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat create() => IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat._(); + @$core.override IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat createEmptyInstance() => create(); static $pb.PbList @@ -581,41 +551,30 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { IngestionDataSourceSettings_CloudStorage_TextFormat? textFormat, IngestionDataSourceSettings_CloudStorage_AvroFormat? avroFormat, IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat? pubsubAvroFormat, - $3.Timestamp? minimumObjectCreateTime, + $2.Timestamp? minimumObjectCreateTime, $core.String? matchGlob, }) { - final $result = create(); - if (state != null) { - $result.state = state; - } - if (bucket != null) { - $result.bucket = bucket; - } - if (textFormat != null) { - $result.textFormat = textFormat; - } - if (avroFormat != null) { - $result.avroFormat = avroFormat; - } - if (pubsubAvroFormat != null) { - $result.pubsubAvroFormat = pubsubAvroFormat; - } - if (minimumObjectCreateTime != null) { - $result.minimumObjectCreateTime = minimumObjectCreateTime; - } - if (matchGlob != null) { - $result.matchGlob = matchGlob; - } - return $result; + final result = create(); + if (state != null) result.state = state; + if (bucket != null) result.bucket = bucket; + if (textFormat != null) result.textFormat = textFormat; + if (avroFormat != null) result.avroFormat = avroFormat; + if (pubsubAvroFormat != null) result.pubsubAvroFormat = pubsubAvroFormat; + if (minimumObjectCreateTime != null) + result.minimumObjectCreateTime = minimumObjectCreateTime; + if (matchGlob != null) result.matchGlob = matchGlob; + return result; } - IngestionDataSourceSettings_CloudStorage._() : super(); + + IngestionDataSourceSettings_CloudStorage._(); + factory IngestionDataSourceSettings_CloudStorage.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionDataSourceSettings_CloudStorage.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionDataSourceSettings_CloudStorage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core .Map<$core.int, IngestionDataSourceSettings_CloudStorage_InputFormat> @@ -648,8 +607,8 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { 5, _omitFieldNames ? '' : 'pubsubAvroFormat', subBuilder: IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat.create) - ..aOM<$3.Timestamp>(6, _omitFieldNames ? '' : 'minimumObjectCreateTime', - subBuilder: $3.Timestamp.create) + ..aOM<$2.Timestamp>(6, _omitFieldNames ? '' : 'minimumObjectCreateTime', + subBuilder: $2.Timestamp.create) ..aOS(9, _omitFieldNames ? '' : 'matchGlob') ..hasRequiredFields = false; @@ -663,11 +622,13 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { updates(message as IngestionDataSourceSettings_CloudStorage)) as IngestionDataSourceSettings_CloudStorage; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings_CloudStorage create() => IngestionDataSourceSettings_CloudStorage._(); + @$core.override IngestionDataSourceSettings_CloudStorage createEmptyInstance() => create(); static $pb.PbList createRepeated() => @@ -688,10 +649,8 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { @$pb.TagNumber(1) IngestionDataSourceSettings_CloudStorage_State get state => $_getN(0); @$pb.TagNumber(1) - set state(IngestionDataSourceSettings_CloudStorage_State v) { - $_setField(1, v); - } - + set state(IngestionDataSourceSettings_CloudStorage_State value) => + $_setField(1, value); @$pb.TagNumber(1) $core.bool hasState() => $_has(0); @$pb.TagNumber(1) @@ -703,10 +662,7 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get bucket => $_getSZ(1); @$pb.TagNumber(2) - set bucket($core.String v) { - $_setString(1, v); - } - + set bucket($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasBucket() => $_has(1); @$pb.TagNumber(2) @@ -717,10 +673,8 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { IngestionDataSourceSettings_CloudStorage_TextFormat get textFormat => $_getN(2); @$pb.TagNumber(3) - set textFormat(IngestionDataSourceSettings_CloudStorage_TextFormat v) { - $_setField(3, v); - } - + set textFormat(IngestionDataSourceSettings_CloudStorage_TextFormat value) => + $_setField(3, value); @$pb.TagNumber(3) $core.bool hasTextFormat() => $_has(2); @$pb.TagNumber(3) @@ -734,10 +688,8 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { IngestionDataSourceSettings_CloudStorage_AvroFormat get avroFormat => $_getN(3); @$pb.TagNumber(4) - set avroFormat(IngestionDataSourceSettings_CloudStorage_AvroFormat v) { - $_setField(4, v); - } - + set avroFormat(IngestionDataSourceSettings_CloudStorage_AvroFormat value) => + $_setField(4, value); @$pb.TagNumber(4) $core.bool hasAvroFormat() => $_has(3); @$pb.TagNumber(4) @@ -754,10 +706,8 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { get pubsubAvroFormat => $_getN(4); @$pb.TagNumber(5) set pubsubAvroFormat( - IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat v) { - $_setField(5, v); - } - + IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat value) => + $_setField(5, value); @$pb.TagNumber(5) $core.bool hasPubsubAvroFormat() => $_has(4); @$pb.TagNumber(5) @@ -769,18 +719,15 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { /// Optional. Only objects with a larger or equal creation timestamp will be /// ingested. @$pb.TagNumber(6) - $3.Timestamp get minimumObjectCreateTime => $_getN(5); + $2.Timestamp get minimumObjectCreateTime => $_getN(5); @$pb.TagNumber(6) - set minimumObjectCreateTime($3.Timestamp v) { - $_setField(6, v); - } - + set minimumObjectCreateTime($2.Timestamp value) => $_setField(6, value); @$pb.TagNumber(6) $core.bool hasMinimumObjectCreateTime() => $_has(5); @$pb.TagNumber(6) void clearMinimumObjectCreateTime() => $_clearField(6); @$pb.TagNumber(6) - $3.Timestamp ensureMinimumObjectCreateTime() => $_ensure(5); + $2.Timestamp ensureMinimumObjectCreateTime() => $_ensure(5); /// Optional. Glob pattern used to match objects that will be ingested. If /// unset, all objects will be ingested. See the [supported @@ -788,10 +735,7 @@ class IngestionDataSourceSettings_CloudStorage extends $pb.GeneratedMessage { @$pb.TagNumber(9) $core.String get matchGlob => $_getSZ(6); @$pb.TagNumber(9) - set matchGlob($core.String v) { - $_setString(6, v); - } - + set matchGlob($core.String value) => $_setString(6, value); @$pb.TagNumber(9) $core.bool hasMatchGlob() => $_has(6); @$pb.TagNumber(9) @@ -810,41 +754,27 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { $core.String? subscriptionId, $core.String? gcpServiceAccount, }) { - final $result = create(); - if (state != null) { - $result.state = state; - } - if (resourceGroup != null) { - $result.resourceGroup = resourceGroup; - } - if (namespace != null) { - $result.namespace = namespace; - } - if (eventHub != null) { - $result.eventHub = eventHub; - } - if (clientId != null) { - $result.clientId = clientId; - } - if (tenantId != null) { - $result.tenantId = tenantId; - } - if (subscriptionId != null) { - $result.subscriptionId = subscriptionId; - } - if (gcpServiceAccount != null) { - $result.gcpServiceAccount = gcpServiceAccount; - } - return $result; + final result = create(); + if (state != null) result.state = state; + if (resourceGroup != null) result.resourceGroup = resourceGroup; + if (namespace != null) result.namespace = namespace; + if (eventHub != null) result.eventHub = eventHub; + if (clientId != null) result.clientId = clientId; + if (tenantId != null) result.tenantId = tenantId; + if (subscriptionId != null) result.subscriptionId = subscriptionId; + if (gcpServiceAccount != null) result.gcpServiceAccount = gcpServiceAccount; + return result; } - IngestionDataSourceSettings_AzureEventHubs._() : super(); + + IngestionDataSourceSettings_AzureEventHubs._(); + factory IngestionDataSourceSettings_AzureEventHubs.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionDataSourceSettings_AzureEventHubs.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionDataSourceSettings_AzureEventHubs.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'IngestionDataSourceSettings.AzureEventHubs', @@ -876,11 +806,13 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { updates(message as IngestionDataSourceSettings_AzureEventHubs)) as IngestionDataSourceSettings_AzureEventHubs; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings_AzureEventHubs create() => IngestionDataSourceSettings_AzureEventHubs._(); + @$core.override IngestionDataSourceSettings_AzureEventHubs createEmptyInstance() => create(); static $pb.PbList createRepeated() => @@ -896,10 +828,8 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { @$pb.TagNumber(1) IngestionDataSourceSettings_AzureEventHubs_State get state => $_getN(0); @$pb.TagNumber(1) - set state(IngestionDataSourceSettings_AzureEventHubs_State v) { - $_setField(1, v); - } - + set state(IngestionDataSourceSettings_AzureEventHubs_State value) => + $_setField(1, value); @$pb.TagNumber(1) $core.bool hasState() => $_has(0); @$pb.TagNumber(1) @@ -909,10 +839,7 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get resourceGroup => $_getSZ(1); @$pb.TagNumber(2) - set resourceGroup($core.String v) { - $_setString(1, v); - } - + set resourceGroup($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasResourceGroup() => $_has(1); @$pb.TagNumber(2) @@ -922,10 +849,7 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get namespace => $_getSZ(2); @$pb.TagNumber(3) - set namespace($core.String v) { - $_setString(2, v); - } - + set namespace($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasNamespace() => $_has(2); @$pb.TagNumber(3) @@ -935,10 +859,7 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get eventHub => $_getSZ(3); @$pb.TagNumber(4) - set eventHub($core.String v) { - $_setString(3, v); - } - + set eventHub($core.String value) => $_setString(3, value); @$pb.TagNumber(4) $core.bool hasEventHub() => $_has(3); @$pb.TagNumber(4) @@ -949,10 +870,7 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.String get clientId => $_getSZ(4); @$pb.TagNumber(5) - set clientId($core.String v) { - $_setString(4, v); - } - + set clientId($core.String value) => $_setString(4, value); @$pb.TagNumber(5) $core.bool hasClientId() => $_has(4); @$pb.TagNumber(5) @@ -963,10 +881,7 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.String get tenantId => $_getSZ(5); @$pb.TagNumber(6) - set tenantId($core.String v) { - $_setString(5, v); - } - + set tenantId($core.String value) => $_setString(5, value); @$pb.TagNumber(6) $core.bool hasTenantId() => $_has(5); @$pb.TagNumber(6) @@ -976,10 +891,7 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.String get subscriptionId => $_getSZ(6); @$pb.TagNumber(7) - set subscriptionId($core.String v) { - $_setString(6, v); - } - + set subscriptionId($core.String value) => $_setString(6, value); @$pb.TagNumber(7) $core.bool hasSubscriptionId() => $_has(6); @$pb.TagNumber(7) @@ -990,10 +902,7 @@ class IngestionDataSourceSettings_AzureEventHubs extends $pb.GeneratedMessage { @$pb.TagNumber(8) $core.String get gcpServiceAccount => $_getSZ(7); @$pb.TagNumber(8) - set gcpServiceAccount($core.String v) { - $_setString(7, v); - } - + set gcpServiceAccount($core.String value) => $_setString(7, value); @$pb.TagNumber(8) $core.bool hasGcpServiceAccount() => $_has(7); @$pb.TagNumber(8) @@ -1009,31 +918,24 @@ class IngestionDataSourceSettings_AwsMsk extends $pb.GeneratedMessage { $core.String? awsRoleArn, $core.String? gcpServiceAccount, }) { - final $result = create(); - if (state != null) { - $result.state = state; - } - if (clusterArn != null) { - $result.clusterArn = clusterArn; - } - if (topic != null) { - $result.topic = topic; - } - if (awsRoleArn != null) { - $result.awsRoleArn = awsRoleArn; - } - if (gcpServiceAccount != null) { - $result.gcpServiceAccount = gcpServiceAccount; - } - return $result; + final result = create(); + if (state != null) result.state = state; + if (clusterArn != null) result.clusterArn = clusterArn; + if (topic != null) result.topic = topic; + if (awsRoleArn != null) result.awsRoleArn = awsRoleArn; + if (gcpServiceAccount != null) result.gcpServiceAccount = gcpServiceAccount; + return result; } - IngestionDataSourceSettings_AwsMsk._() : super(); - factory IngestionDataSourceSettings_AwsMsk.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionDataSourceSettings_AwsMsk.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + IngestionDataSourceSettings_AwsMsk._(); + + factory IngestionDataSourceSettings_AwsMsk.fromBuffer( + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionDataSourceSettings_AwsMsk.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'IngestionDataSourceSettings.AwsMsk', @@ -1062,11 +964,13 @@ class IngestionDataSourceSettings_AwsMsk extends $pb.GeneratedMessage { updates(message as IngestionDataSourceSettings_AwsMsk)) as IngestionDataSourceSettings_AwsMsk; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings_AwsMsk create() => IngestionDataSourceSettings_AwsMsk._(); + @$core.override IngestionDataSourceSettings_AwsMsk createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1081,10 +985,8 @@ class IngestionDataSourceSettings_AwsMsk extends $pb.GeneratedMessage { @$pb.TagNumber(1) IngestionDataSourceSettings_AwsMsk_State get state => $_getN(0); @$pb.TagNumber(1) - set state(IngestionDataSourceSettings_AwsMsk_State v) { - $_setField(1, v); - } - + set state(IngestionDataSourceSettings_AwsMsk_State value) => + $_setField(1, value); @$pb.TagNumber(1) $core.bool hasState() => $_has(0); @$pb.TagNumber(1) @@ -1095,10 +997,7 @@ class IngestionDataSourceSettings_AwsMsk extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get clusterArn => $_getSZ(1); @$pb.TagNumber(2) - set clusterArn($core.String v) { - $_setString(1, v); - } - + set clusterArn($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasClusterArn() => $_has(1); @$pb.TagNumber(2) @@ -1109,10 +1008,7 @@ class IngestionDataSourceSettings_AwsMsk extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get topic => $_getSZ(2); @$pb.TagNumber(3) - set topic($core.String v) { - $_setString(2, v); - } - + set topic($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasTopic() => $_has(2); @$pb.TagNumber(3) @@ -1124,10 +1020,7 @@ class IngestionDataSourceSettings_AwsMsk extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get awsRoleArn => $_getSZ(3); @$pb.TagNumber(4) - set awsRoleArn($core.String v) { - $_setString(3, v); - } - + set awsRoleArn($core.String value) => $_setString(3, value); @$pb.TagNumber(4) $core.bool hasAwsRoleArn() => $_has(3); @$pb.TagNumber(4) @@ -1140,10 +1033,7 @@ class IngestionDataSourceSettings_AwsMsk extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.String get gcpServiceAccount => $_getSZ(4); @$pb.TagNumber(5) - set gcpServiceAccount($core.String v) { - $_setString(4, v); - } - + set gcpServiceAccount($core.String value) => $_setString(4, value); @$pb.TagNumber(5) $core.bool hasGcpServiceAccount() => $_has(4); @$pb.TagNumber(5) @@ -1160,35 +1050,25 @@ class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { $core.String? identityPoolId, $core.String? gcpServiceAccount, }) { - final $result = create(); - if (state != null) { - $result.state = state; - } - if (bootstrapServer != null) { - $result.bootstrapServer = bootstrapServer; - } - if (clusterId != null) { - $result.clusterId = clusterId; - } - if (topic != null) { - $result.topic = topic; - } - if (identityPoolId != null) { - $result.identityPoolId = identityPoolId; - } - if (gcpServiceAccount != null) { - $result.gcpServiceAccount = gcpServiceAccount; - } - return $result; + final result = create(); + if (state != null) result.state = state; + if (bootstrapServer != null) result.bootstrapServer = bootstrapServer; + if (clusterId != null) result.clusterId = clusterId; + if (topic != null) result.topic = topic; + if (identityPoolId != null) result.identityPoolId = identityPoolId; + if (gcpServiceAccount != null) result.gcpServiceAccount = gcpServiceAccount; + return result; } - IngestionDataSourceSettings_ConfluentCloud._() : super(); + + IngestionDataSourceSettings_ConfluentCloud._(); + factory IngestionDataSourceSettings_ConfluentCloud.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionDataSourceSettings_ConfluentCloud.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionDataSourceSettings_ConfluentCloud.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'IngestionDataSourceSettings.ConfluentCloud', @@ -1218,11 +1098,13 @@ class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { updates(message as IngestionDataSourceSettings_ConfluentCloud)) as IngestionDataSourceSettings_ConfluentCloud; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings_ConfluentCloud create() => IngestionDataSourceSettings_ConfluentCloud._(); + @$core.override IngestionDataSourceSettings_ConfluentCloud createEmptyInstance() => create(); static $pb.PbList createRepeated() => @@ -1238,10 +1120,8 @@ class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { @$pb.TagNumber(1) IngestionDataSourceSettings_ConfluentCloud_State get state => $_getN(0); @$pb.TagNumber(1) - set state(IngestionDataSourceSettings_ConfluentCloud_State v) { - $_setField(1, v); - } - + set state(IngestionDataSourceSettings_ConfluentCloud_State value) => + $_setField(1, value); @$pb.TagNumber(1) $core.bool hasState() => $_has(0); @$pb.TagNumber(1) @@ -1251,10 +1131,7 @@ class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get bootstrapServer => $_getSZ(1); @$pb.TagNumber(2) - set bootstrapServer($core.String v) { - $_setString(1, v); - } - + set bootstrapServer($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasBootstrapServer() => $_has(1); @$pb.TagNumber(2) @@ -1264,10 +1141,7 @@ class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get clusterId => $_getSZ(2); @$pb.TagNumber(3) - set clusterId($core.String v) { - $_setString(2, v); - } - + set clusterId($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasClusterId() => $_has(2); @$pb.TagNumber(3) @@ -1278,10 +1152,7 @@ class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get topic => $_getSZ(3); @$pb.TagNumber(4) - set topic($core.String v) { - $_setString(3, v); - } - + set topic($core.String value) => $_setString(3, value); @$pb.TagNumber(4) $core.bool hasTopic() => $_has(3); @$pb.TagNumber(4) @@ -1293,10 +1164,7 @@ class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.String get identityPoolId => $_getSZ(4); @$pb.TagNumber(5) - set identityPoolId($core.String v) { - $_setString(4, v); - } - + set identityPoolId($core.String value) => $_setString(4, value); @$pb.TagNumber(5) $core.bool hasIdentityPoolId() => $_has(4); @$pb.TagNumber(5) @@ -1307,10 +1175,7 @@ class IngestionDataSourceSettings_ConfluentCloud extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.String get gcpServiceAccount => $_getSZ(5); @$pb.TagNumber(6) - set gcpServiceAccount($core.String v) { - $_setString(5, v); - } - + set gcpServiceAccount($core.String value) => $_setString(5, value); @$pb.TagNumber(6) $core.bool hasGcpServiceAccount() => $_has(5); @$pb.TagNumber(6) @@ -1336,34 +1201,25 @@ class IngestionDataSourceSettings extends $pb.GeneratedMessage { IngestionDataSourceSettings_AwsMsk? awsMsk, IngestionDataSourceSettings_ConfluentCloud? confluentCloud, }) { - final $result = create(); - if (awsKinesis != null) { - $result.awsKinesis = awsKinesis; - } - if (cloudStorage != null) { - $result.cloudStorage = cloudStorage; - } - if (azureEventHubs != null) { - $result.azureEventHubs = azureEventHubs; - } - if (platformLogsSettings != null) { - $result.platformLogsSettings = platformLogsSettings; - } - if (awsMsk != null) { - $result.awsMsk = awsMsk; - } - if (confluentCloud != null) { - $result.confluentCloud = confluentCloud; - } - return $result; - } - IngestionDataSourceSettings._() : super(); - factory IngestionDataSourceSettings.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionDataSourceSettings.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + final result = create(); + if (awsKinesis != null) result.awsKinesis = awsKinesis; + if (cloudStorage != null) result.cloudStorage = cloudStorage; + if (azureEventHubs != null) result.azureEventHubs = azureEventHubs; + if (platformLogsSettings != null) + result.platformLogsSettings = platformLogsSettings; + if (awsMsk != null) result.awsMsk = awsMsk; + if (confluentCloud != null) result.confluentCloud = confluentCloud; + return result; + } + + IngestionDataSourceSettings._(); + + factory IngestionDataSourceSettings.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionDataSourceSettings.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, IngestionDataSourceSettings_Source> _IngestionDataSourceSettings_SourceByTag = { @@ -1410,11 +1266,13 @@ class IngestionDataSourceSettings extends $pb.GeneratedMessage { (message) => updates(message as IngestionDataSourceSettings)) as IngestionDataSourceSettings; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionDataSourceSettings create() => IngestionDataSourceSettings._(); + @$core.override IngestionDataSourceSettings createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1431,10 +1289,8 @@ class IngestionDataSourceSettings extends $pb.GeneratedMessage { @$pb.TagNumber(1) IngestionDataSourceSettings_AwsKinesis get awsKinesis => $_getN(0); @$pb.TagNumber(1) - set awsKinesis(IngestionDataSourceSettings_AwsKinesis v) { - $_setField(1, v); - } - + set awsKinesis(IngestionDataSourceSettings_AwsKinesis value) => + $_setField(1, value); @$pb.TagNumber(1) $core.bool hasAwsKinesis() => $_has(0); @$pb.TagNumber(1) @@ -1446,10 +1302,8 @@ class IngestionDataSourceSettings extends $pb.GeneratedMessage { @$pb.TagNumber(2) IngestionDataSourceSettings_CloudStorage get cloudStorage => $_getN(1); @$pb.TagNumber(2) - set cloudStorage(IngestionDataSourceSettings_CloudStorage v) { - $_setField(2, v); - } - + set cloudStorage(IngestionDataSourceSettings_CloudStorage value) => + $_setField(2, value); @$pb.TagNumber(2) $core.bool hasCloudStorage() => $_has(1); @$pb.TagNumber(2) @@ -1461,10 +1315,8 @@ class IngestionDataSourceSettings extends $pb.GeneratedMessage { @$pb.TagNumber(3) IngestionDataSourceSettings_AzureEventHubs get azureEventHubs => $_getN(2); @$pb.TagNumber(3) - set azureEventHubs(IngestionDataSourceSettings_AzureEventHubs v) { - $_setField(3, v); - } - + set azureEventHubs(IngestionDataSourceSettings_AzureEventHubs value) => + $_setField(3, value); @$pb.TagNumber(3) $core.bool hasAzureEventHubs() => $_has(2); @$pb.TagNumber(3) @@ -1478,10 +1330,7 @@ class IngestionDataSourceSettings extends $pb.GeneratedMessage { @$pb.TagNumber(4) PlatformLogsSettings get platformLogsSettings => $_getN(3); @$pb.TagNumber(4) - set platformLogsSettings(PlatformLogsSettings v) { - $_setField(4, v); - } - + set platformLogsSettings(PlatformLogsSettings value) => $_setField(4, value); @$pb.TagNumber(4) $core.bool hasPlatformLogsSettings() => $_has(3); @$pb.TagNumber(4) @@ -1493,10 +1342,7 @@ class IngestionDataSourceSettings extends $pb.GeneratedMessage { @$pb.TagNumber(5) IngestionDataSourceSettings_AwsMsk get awsMsk => $_getN(4); @$pb.TagNumber(5) - set awsMsk(IngestionDataSourceSettings_AwsMsk v) { - $_setField(5, v); - } - + set awsMsk(IngestionDataSourceSettings_AwsMsk value) => $_setField(5, value); @$pb.TagNumber(5) $core.bool hasAwsMsk() => $_has(4); @$pb.TagNumber(5) @@ -1508,10 +1354,8 @@ class IngestionDataSourceSettings extends $pb.GeneratedMessage { @$pb.TagNumber(6) IngestionDataSourceSettings_ConfluentCloud get confluentCloud => $_getN(5); @$pb.TagNumber(6) - set confluentCloud(IngestionDataSourceSettings_ConfluentCloud v) { - $_setField(6, v); - } - + set confluentCloud(IngestionDataSourceSettings_ConfluentCloud value) => + $_setField(6, value); @$pb.TagNumber(6) $core.bool hasConfluentCloud() => $_has(5); @$pb.TagNumber(6) @@ -1526,19 +1370,19 @@ class PlatformLogsSettings extends $pb.GeneratedMessage { factory PlatformLogsSettings({ PlatformLogsSettings_Severity? severity, }) { - final $result = create(); - if (severity != null) { - $result.severity = severity; - } - return $result; + final result = create(); + if (severity != null) result.severity = severity; + return result; } - PlatformLogsSettings._() : super(); - factory PlatformLogsSettings.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PlatformLogsSettings.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PlatformLogsSettings._(); + + factory PlatformLogsSettings.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PlatformLogsSettings.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PlatformLogsSettings', @@ -1560,10 +1404,12 @@ class PlatformLogsSettings extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PlatformLogsSettings)) as PlatformLogsSettings; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PlatformLogsSettings create() => PlatformLogsSettings._(); + @$core.override PlatformLogsSettings createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1576,10 +1422,7 @@ class PlatformLogsSettings extends $pb.GeneratedMessage { @$pb.TagNumber(1) PlatformLogsSettings_Severity get severity => $_getN(0); @$pb.TagNumber(1) - set severity(PlatformLogsSettings_Severity v) { - $_setField(1, v); - } - + set severity(PlatformLogsSettings_Severity value) => $_setField(1, value); @$pb.TagNumber(1) $core.bool hasSeverity() => $_has(0); @$pb.TagNumber(1) @@ -1596,14 +1439,16 @@ class PlatformLogsSettings extends $pb.GeneratedMessage { /// all, and ingestion of the subsequent messages will proceed as normal. class IngestionFailureEvent_ApiViolationReason extends $pb.GeneratedMessage { factory IngestionFailureEvent_ApiViolationReason() => create(); - IngestionFailureEvent_ApiViolationReason._() : super(); + + IngestionFailureEvent_ApiViolationReason._(); + factory IngestionFailureEvent_ApiViolationReason.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionFailureEvent_ApiViolationReason.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionFailureEvent_ApiViolationReason.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'IngestionFailureEvent.ApiViolationReason', @@ -1622,11 +1467,13 @@ class IngestionFailureEvent_ApiViolationReason extends $pb.GeneratedMessage { updates(message as IngestionFailureEvent_ApiViolationReason)) as IngestionFailureEvent_ApiViolationReason; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_ApiViolationReason create() => IngestionFailureEvent_ApiViolationReason._(); + @$core.override IngestionFailureEvent_ApiViolationReason createEmptyInstance() => create(); static $pb.PbList createRepeated() => @@ -1642,14 +1489,16 @@ class IngestionFailureEvent_ApiViolationReason extends $pb.GeneratedMessage { /// occurs, one or more Avro objects won't be ingested. class IngestionFailureEvent_AvroFailureReason extends $pb.GeneratedMessage { factory IngestionFailureEvent_AvroFailureReason() => create(); - IngestionFailureEvent_AvroFailureReason._() : super(); + + IngestionFailureEvent_AvroFailureReason._(); + factory IngestionFailureEvent_AvroFailureReason.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionFailureEvent_AvroFailureReason.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionFailureEvent_AvroFailureReason.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'IngestionFailureEvent.AvroFailureReason', @@ -1668,11 +1517,13 @@ class IngestionFailureEvent_AvroFailureReason extends $pb.GeneratedMessage { updates(message as IngestionFailureEvent_AvroFailureReason)) as IngestionFailureEvent_AvroFailureReason; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_AvroFailureReason create() => IngestionFailureEvent_AvroFailureReason._(); + @$core.override IngestionFailureEvent_AvroFailureReason createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1687,14 +1538,17 @@ class IngestionFailureEvent_AvroFailureReason extends $pb.GeneratedMessage { /// validation violation. class IngestionFailureEvent_SchemaViolationReason extends $pb.GeneratedMessage { factory IngestionFailureEvent_SchemaViolationReason() => create(); - IngestionFailureEvent_SchemaViolationReason._() : super(); + + IngestionFailureEvent_SchemaViolationReason._(); + factory IngestionFailureEvent_SchemaViolationReason.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionFailureEvent_SchemaViolationReason.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionFailureEvent_SchemaViolationReason.fromJson( + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'IngestionFailureEvent.SchemaViolationReason', @@ -1713,11 +1567,13 @@ class IngestionFailureEvent_SchemaViolationReason extends $pb.GeneratedMessage { updates(message as IngestionFailureEvent_SchemaViolationReason)) as IngestionFailureEvent_SchemaViolationReason; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_SchemaViolationReason create() => IngestionFailureEvent_SchemaViolationReason._(); + @$core.override IngestionFailureEvent_SchemaViolationReason createEmptyInstance() => create(); static $pb.PbList createRepeated() => @@ -1735,15 +1591,17 @@ class IngestionFailureEvent_MessageTransformationFailureReason extends $pb.GeneratedMessage { factory IngestionFailureEvent_MessageTransformationFailureReason() => create(); - IngestionFailureEvent_MessageTransformationFailureReason._() : super(); + + IngestionFailureEvent_MessageTransformationFailureReason._(); + factory IngestionFailureEvent_MessageTransformationFailureReason.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); factory IngestionFailureEvent_MessageTransformationFailureReason.fromJson( - $core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames @@ -1767,11 +1625,13 @@ class IngestionFailureEvent_MessageTransformationFailureReason as IngestionFailureEvent_MessageTransformationFailureReason)) as IngestionFailureEvent_MessageTransformationFailureReason; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_MessageTransformationFailureReason create() => IngestionFailureEvent_MessageTransformationFailureReason._(); + @$core.override IngestionFailureEvent_MessageTransformationFailureReason createEmptyInstance() => create(); static $pb.PbList @@ -1805,39 +1665,30 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { IngestionFailureEvent_MessageTransformationFailureReason? messageTransformationFailureReason, }) { - final $result = create(); - if (bucket != null) { - $result.bucket = bucket; - } - if (objectName != null) { - $result.objectName = objectName; - } - if (objectGeneration != null) { - $result.objectGeneration = objectGeneration; - } - if (avroFailureReason != null) { - $result.avroFailureReason = avroFailureReason; - } - if (apiViolationReason != null) { - $result.apiViolationReason = apiViolationReason; - } - if (schemaViolationReason != null) { - $result.schemaViolationReason = schemaViolationReason; - } - if (messageTransformationFailureReason != null) { - $result.messageTransformationFailureReason = + final result = create(); + if (bucket != null) result.bucket = bucket; + if (objectName != null) result.objectName = objectName; + if (objectGeneration != null) result.objectGeneration = objectGeneration; + if (avroFailureReason != null) result.avroFailureReason = avroFailureReason; + if (apiViolationReason != null) + result.apiViolationReason = apiViolationReason; + if (schemaViolationReason != null) + result.schemaViolationReason = schemaViolationReason; + if (messageTransformationFailureReason != null) + result.messageTransformationFailureReason = messageTransformationFailureReason; - } - return $result; + return result; } - IngestionFailureEvent_CloudStorageFailure._() : super(); + + IngestionFailureEvent_CloudStorageFailure._(); + factory IngestionFailureEvent_CloudStorageFailure.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionFailureEvent_CloudStorageFailure.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionFailureEvent_CloudStorageFailure.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core .Map<$core.int, IngestionFailureEvent_CloudStorageFailure_Reason> @@ -1883,11 +1734,13 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { updates(message as IngestionFailureEvent_CloudStorageFailure)) as IngestionFailureEvent_CloudStorageFailure; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_CloudStorageFailure create() => IngestionFailureEvent_CloudStorageFailure._(); + @$core.override IngestionFailureEvent_CloudStorageFailure createEmptyInstance() => create(); static $pb.PbList createRepeated() => @@ -1906,10 +1759,7 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get bucket => $_getSZ(0); @$pb.TagNumber(1) - set bucket($core.String v) { - $_setString(0, v); - } - + set bucket($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasBucket() => $_has(0); @$pb.TagNumber(1) @@ -1920,10 +1770,7 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get objectName => $_getSZ(1); @$pb.TagNumber(2) - set objectName($core.String v) { - $_setString(1, v); - } - + set objectName($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasObjectName() => $_has(1); @$pb.TagNumber(2) @@ -1934,10 +1781,7 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { @$pb.TagNumber(3) $fixnum.Int64 get objectGeneration => $_getI64(2); @$pb.TagNumber(3) - set objectGeneration($fixnum.Int64 v) { - $_setInt64(2, v); - } - + set objectGeneration($fixnum.Int64 value) => $_setInt64(2, value); @$pb.TagNumber(3) $core.bool hasObjectGeneration() => $_has(2); @$pb.TagNumber(3) @@ -1947,10 +1791,8 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { @$pb.TagNumber(5) IngestionFailureEvent_AvroFailureReason get avroFailureReason => $_getN(3); @$pb.TagNumber(5) - set avroFailureReason(IngestionFailureEvent_AvroFailureReason v) { - $_setField(5, v); - } - + set avroFailureReason(IngestionFailureEvent_AvroFailureReason value) => + $_setField(5, value); @$pb.TagNumber(5) $core.bool hasAvroFailureReason() => $_has(3); @$pb.TagNumber(5) @@ -1964,10 +1806,8 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { @$pb.TagNumber(6) IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(4); @$pb.TagNumber(6) - set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { - $_setField(6, v); - } - + set apiViolationReason(IngestionFailureEvent_ApiViolationReason value) => + $_setField(6, value); @$pb.TagNumber(6) $core.bool hasApiViolationReason() => $_has(4); @$pb.TagNumber(6) @@ -1981,10 +1821,9 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => $_getN(5); @$pb.TagNumber(7) - set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { - $_setField(7, v); - } - + set schemaViolationReason( + IngestionFailureEvent_SchemaViolationReason value) => + $_setField(7, value); @$pb.TagNumber(7) $core.bool hasSchemaViolationReason() => $_has(5); @$pb.TagNumber(7) @@ -2000,10 +1839,8 @@ class IngestionFailureEvent_CloudStorageFailure extends $pb.GeneratedMessage { get messageTransformationFailureReason => $_getN(6); @$pb.TagNumber(8) set messageTransformationFailureReason( - IngestionFailureEvent_MessageTransformationFailureReason v) { - $_setField(8, v); - } - + IngestionFailureEvent_MessageTransformationFailureReason value) => + $_setField(8, value); @$pb.TagNumber(8) $core.bool hasMessageTransformationFailureReason() => $_has(6); @$pb.TagNumber(8) @@ -2032,39 +1869,30 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { IngestionFailureEvent_MessageTransformationFailureReason? messageTransformationFailureReason, }) { - final $result = create(); - if (clusterArn != null) { - $result.clusterArn = clusterArn; - } - if (kafkaTopic != null) { - $result.kafkaTopic = kafkaTopic; - } - if (partitionId != null) { - $result.partitionId = partitionId; - } - if (offset != null) { - $result.offset = offset; - } - if (apiViolationReason != null) { - $result.apiViolationReason = apiViolationReason; - } - if (schemaViolationReason != null) { - $result.schemaViolationReason = schemaViolationReason; - } - if (messageTransformationFailureReason != null) { - $result.messageTransformationFailureReason = + final result = create(); + if (clusterArn != null) result.clusterArn = clusterArn; + if (kafkaTopic != null) result.kafkaTopic = kafkaTopic; + if (partitionId != null) result.partitionId = partitionId; + if (offset != null) result.offset = offset; + if (apiViolationReason != null) + result.apiViolationReason = apiViolationReason; + if (schemaViolationReason != null) + result.schemaViolationReason = schemaViolationReason; + if (messageTransformationFailureReason != null) + result.messageTransformationFailureReason = messageTransformationFailureReason; - } - return $result; + return result; } - IngestionFailureEvent_AwsMskFailureReason._() : super(); + + IngestionFailureEvent_AwsMskFailureReason._(); + factory IngestionFailureEvent_AwsMskFailureReason.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionFailureEvent_AwsMskFailureReason.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionFailureEvent_AwsMskFailureReason.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core .Map<$core.int, IngestionFailureEvent_AwsMskFailureReason_Reason> @@ -2107,11 +1935,13 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { updates(message as IngestionFailureEvent_AwsMskFailureReason)) as IngestionFailureEvent_AwsMskFailureReason; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_AwsMskFailureReason create() => IngestionFailureEvent_AwsMskFailureReason._(); + @$core.override IngestionFailureEvent_AwsMskFailureReason createEmptyInstance() => create(); static $pb.PbList createRepeated() => @@ -2130,10 +1960,7 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get clusterArn => $_getSZ(0); @$pb.TagNumber(1) - set clusterArn($core.String v) { - $_setString(0, v); - } - + set clusterArn($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasClusterArn() => $_has(0); @$pb.TagNumber(1) @@ -2143,10 +1970,7 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get kafkaTopic => $_getSZ(1); @$pb.TagNumber(2) - set kafkaTopic($core.String v) { - $_setString(1, v); - } - + set kafkaTopic($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasKafkaTopic() => $_has(1); @$pb.TagNumber(2) @@ -2156,10 +1980,7 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { @$pb.TagNumber(3) $fixnum.Int64 get partitionId => $_getI64(2); @$pb.TagNumber(3) - set partitionId($fixnum.Int64 v) { - $_setInt64(2, v); - } - + set partitionId($fixnum.Int64 value) => $_setInt64(2, value); @$pb.TagNumber(3) $core.bool hasPartitionId() => $_has(2); @$pb.TagNumber(3) @@ -2170,10 +1991,7 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { @$pb.TagNumber(4) $fixnum.Int64 get offset => $_getI64(3); @$pb.TagNumber(4) - set offset($fixnum.Int64 v) { - $_setInt64(3, v); - } - + set offset($fixnum.Int64 value) => $_setInt64(3, value); @$pb.TagNumber(4) $core.bool hasOffset() => $_has(3); @$pb.TagNumber(4) @@ -2184,10 +2002,8 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { @$pb.TagNumber(5) IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(4); @$pb.TagNumber(5) - set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { - $_setField(5, v); - } - + set apiViolationReason(IngestionFailureEvent_ApiViolationReason value) => + $_setField(5, value); @$pb.TagNumber(5) $core.bool hasApiViolationReason() => $_has(4); @$pb.TagNumber(5) @@ -2201,10 +2017,9 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => $_getN(5); @$pb.TagNumber(6) - set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { - $_setField(6, v); - } - + set schemaViolationReason( + IngestionFailureEvent_SchemaViolationReason value) => + $_setField(6, value); @$pb.TagNumber(6) $core.bool hasSchemaViolationReason() => $_has(5); @$pb.TagNumber(6) @@ -2220,10 +2035,8 @@ class IngestionFailureEvent_AwsMskFailureReason extends $pb.GeneratedMessage { get messageTransformationFailureReason => $_getN(6); @$pb.TagNumber(7) set messageTransformationFailureReason( - IngestionFailureEvent_MessageTransformationFailureReason v) { - $_setField(7, v); - } - + IngestionFailureEvent_MessageTransformationFailureReason value) => + $_setField(7, value); @$pb.TagNumber(7) $core.bool hasMessageTransformationFailureReason() => $_has(6); @$pb.TagNumber(7) @@ -2253,40 +2066,31 @@ class IngestionFailureEvent_AzureEventHubsFailureReason IngestionFailureEvent_MessageTransformationFailureReason? messageTransformationFailureReason, }) { - final $result = create(); - if (namespace != null) { - $result.namespace = namespace; - } - if (eventHub != null) { - $result.eventHub = eventHub; - } - if (partitionId != null) { - $result.partitionId = partitionId; - } - if (offset != null) { - $result.offset = offset; - } - if (apiViolationReason != null) { - $result.apiViolationReason = apiViolationReason; - } - if (schemaViolationReason != null) { - $result.schemaViolationReason = schemaViolationReason; - } - if (messageTransformationFailureReason != null) { - $result.messageTransformationFailureReason = + final result = create(); + if (namespace != null) result.namespace = namespace; + if (eventHub != null) result.eventHub = eventHub; + if (partitionId != null) result.partitionId = partitionId; + if (offset != null) result.offset = offset; + if (apiViolationReason != null) + result.apiViolationReason = apiViolationReason; + if (schemaViolationReason != null) + result.schemaViolationReason = schemaViolationReason; + if (messageTransformationFailureReason != null) + result.messageTransformationFailureReason = messageTransformationFailureReason; - } - return $result; + return result; } - IngestionFailureEvent_AzureEventHubsFailureReason._() : super(); + + IngestionFailureEvent_AzureEventHubsFailureReason._(); + factory IngestionFailureEvent_AzureEventHubsFailureReason.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); factory IngestionFailureEvent_AzureEventHubsFailureReason.fromJson( - $core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core .Map<$core.int, IngestionFailureEvent_AzureEventHubsFailureReason_Reason> @@ -2335,11 +2139,13 @@ class IngestionFailureEvent_AzureEventHubsFailureReason message as IngestionFailureEvent_AzureEventHubsFailureReason)) as IngestionFailureEvent_AzureEventHubsFailureReason; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_AzureEventHubsFailureReason create() => IngestionFailureEvent_AzureEventHubsFailureReason._(); + @$core.override IngestionFailureEvent_AzureEventHubsFailureReason createEmptyInstance() => create(); static $pb.PbList @@ -2360,10 +2166,7 @@ class IngestionFailureEvent_AzureEventHubsFailureReason @$pb.TagNumber(1) $core.String get namespace => $_getSZ(0); @$pb.TagNumber(1) - set namespace($core.String v) { - $_setString(0, v); - } - + set namespace($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasNamespace() => $_has(0); @$pb.TagNumber(1) @@ -2373,10 +2176,7 @@ class IngestionFailureEvent_AzureEventHubsFailureReason @$pb.TagNumber(2) $core.String get eventHub => $_getSZ(1); @$pb.TagNumber(2) - set eventHub($core.String v) { - $_setString(1, v); - } - + set eventHub($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasEventHub() => $_has(1); @$pb.TagNumber(2) @@ -2386,10 +2186,7 @@ class IngestionFailureEvent_AzureEventHubsFailureReason @$pb.TagNumber(3) $fixnum.Int64 get partitionId => $_getI64(2); @$pb.TagNumber(3) - set partitionId($fixnum.Int64 v) { - $_setInt64(2, v); - } - + set partitionId($fixnum.Int64 value) => $_setInt64(2, value); @$pb.TagNumber(3) $core.bool hasPartitionId() => $_has(2); @$pb.TagNumber(3) @@ -2400,10 +2197,7 @@ class IngestionFailureEvent_AzureEventHubsFailureReason @$pb.TagNumber(4) $fixnum.Int64 get offset => $_getI64(3); @$pb.TagNumber(4) - set offset($fixnum.Int64 v) { - $_setInt64(3, v); - } - + set offset($fixnum.Int64 value) => $_setInt64(3, value); @$pb.TagNumber(4) $core.bool hasOffset() => $_has(3); @$pb.TagNumber(4) @@ -2414,10 +2208,8 @@ class IngestionFailureEvent_AzureEventHubsFailureReason @$pb.TagNumber(5) IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(4); @$pb.TagNumber(5) - set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { - $_setField(5, v); - } - + set apiViolationReason(IngestionFailureEvent_ApiViolationReason value) => + $_setField(5, value); @$pb.TagNumber(5) $core.bool hasApiViolationReason() => $_has(4); @$pb.TagNumber(5) @@ -2431,10 +2223,9 @@ class IngestionFailureEvent_AzureEventHubsFailureReason IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => $_getN(5); @$pb.TagNumber(6) - set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { - $_setField(6, v); - } - + set schemaViolationReason( + IngestionFailureEvent_SchemaViolationReason value) => + $_setField(6, value); @$pb.TagNumber(6) $core.bool hasSchemaViolationReason() => $_has(5); @$pb.TagNumber(6) @@ -2450,10 +2241,8 @@ class IngestionFailureEvent_AzureEventHubsFailureReason get messageTransformationFailureReason => $_getN(6); @$pb.TagNumber(7) set messageTransformationFailureReason( - IngestionFailureEvent_MessageTransformationFailureReason v) { - $_setField(7, v); - } - + IngestionFailureEvent_MessageTransformationFailureReason value) => + $_setField(7, value); @$pb.TagNumber(7) $core.bool hasMessageTransformationFailureReason() => $_has(6); @$pb.TagNumber(7) @@ -2483,40 +2272,31 @@ class IngestionFailureEvent_ConfluentCloudFailureReason IngestionFailureEvent_MessageTransformationFailureReason? messageTransformationFailureReason, }) { - final $result = create(); - if (clusterId != null) { - $result.clusterId = clusterId; - } - if (kafkaTopic != null) { - $result.kafkaTopic = kafkaTopic; - } - if (partitionId != null) { - $result.partitionId = partitionId; - } - if (offset != null) { - $result.offset = offset; - } - if (apiViolationReason != null) { - $result.apiViolationReason = apiViolationReason; - } - if (schemaViolationReason != null) { - $result.schemaViolationReason = schemaViolationReason; - } - if (messageTransformationFailureReason != null) { - $result.messageTransformationFailureReason = + final result = create(); + if (clusterId != null) result.clusterId = clusterId; + if (kafkaTopic != null) result.kafkaTopic = kafkaTopic; + if (partitionId != null) result.partitionId = partitionId; + if (offset != null) result.offset = offset; + if (apiViolationReason != null) + result.apiViolationReason = apiViolationReason; + if (schemaViolationReason != null) + result.schemaViolationReason = schemaViolationReason; + if (messageTransformationFailureReason != null) + result.messageTransformationFailureReason = messageTransformationFailureReason; - } - return $result; + return result; } - IngestionFailureEvent_ConfluentCloudFailureReason._() : super(); + + IngestionFailureEvent_ConfluentCloudFailureReason._(); + factory IngestionFailureEvent_ConfluentCloudFailureReason.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); factory IngestionFailureEvent_ConfluentCloudFailureReason.fromJson( - $core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core .Map<$core.int, IngestionFailureEvent_ConfluentCloudFailureReason_Reason> @@ -2565,11 +2345,13 @@ class IngestionFailureEvent_ConfluentCloudFailureReason message as IngestionFailureEvent_ConfluentCloudFailureReason)) as IngestionFailureEvent_ConfluentCloudFailureReason; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_ConfluentCloudFailureReason create() => IngestionFailureEvent_ConfluentCloudFailureReason._(); + @$core.override IngestionFailureEvent_ConfluentCloudFailureReason createEmptyInstance() => create(); static $pb.PbList @@ -2590,10 +2372,7 @@ class IngestionFailureEvent_ConfluentCloudFailureReason @$pb.TagNumber(1) $core.String get clusterId => $_getSZ(0); @$pb.TagNumber(1) - set clusterId($core.String v) { - $_setString(0, v); - } - + set clusterId($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasClusterId() => $_has(0); @$pb.TagNumber(1) @@ -2603,10 +2382,7 @@ class IngestionFailureEvent_ConfluentCloudFailureReason @$pb.TagNumber(2) $core.String get kafkaTopic => $_getSZ(1); @$pb.TagNumber(2) - set kafkaTopic($core.String v) { - $_setString(1, v); - } - + set kafkaTopic($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasKafkaTopic() => $_has(1); @$pb.TagNumber(2) @@ -2616,10 +2392,7 @@ class IngestionFailureEvent_ConfluentCloudFailureReason @$pb.TagNumber(3) $fixnum.Int64 get partitionId => $_getI64(2); @$pb.TagNumber(3) - set partitionId($fixnum.Int64 v) { - $_setInt64(2, v); - } - + set partitionId($fixnum.Int64 value) => $_setInt64(2, value); @$pb.TagNumber(3) $core.bool hasPartitionId() => $_has(2); @$pb.TagNumber(3) @@ -2630,10 +2403,7 @@ class IngestionFailureEvent_ConfluentCloudFailureReason @$pb.TagNumber(4) $fixnum.Int64 get offset => $_getI64(3); @$pb.TagNumber(4) - set offset($fixnum.Int64 v) { - $_setInt64(3, v); - } - + set offset($fixnum.Int64 value) => $_setInt64(3, value); @$pb.TagNumber(4) $core.bool hasOffset() => $_has(3); @$pb.TagNumber(4) @@ -2644,10 +2414,8 @@ class IngestionFailureEvent_ConfluentCloudFailureReason @$pb.TagNumber(5) IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(4); @$pb.TagNumber(5) - set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { - $_setField(5, v); - } - + set apiViolationReason(IngestionFailureEvent_ApiViolationReason value) => + $_setField(5, value); @$pb.TagNumber(5) $core.bool hasApiViolationReason() => $_has(4); @$pb.TagNumber(5) @@ -2661,10 +2429,9 @@ class IngestionFailureEvent_ConfluentCloudFailureReason IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => $_getN(5); @$pb.TagNumber(6) - set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { - $_setField(6, v); - } - + set schemaViolationReason( + IngestionFailureEvent_SchemaViolationReason value) => + $_setField(6, value); @$pb.TagNumber(6) $core.bool hasSchemaViolationReason() => $_has(5); @$pb.TagNumber(6) @@ -2680,10 +2447,8 @@ class IngestionFailureEvent_ConfluentCloudFailureReason get messageTransformationFailureReason => $_getN(6); @$pb.TagNumber(7) set messageTransformationFailureReason( - IngestionFailureEvent_MessageTransformationFailureReason v) { - $_setField(7, v); - } - + IngestionFailureEvent_MessageTransformationFailureReason value) => + $_setField(7, value); @$pb.TagNumber(7) $core.bool hasMessageTransformationFailureReason() => $_has(6); @$pb.TagNumber(7) @@ -2712,36 +2477,30 @@ class IngestionFailureEvent_AwsKinesisFailureReason messageTransformationFailureReason, IngestionFailureEvent_ApiViolationReason? apiViolationReason, }) { - final $result = create(); - if (streamArn != null) { - $result.streamArn = streamArn; - } - if (partitionKey != null) { - $result.partitionKey = partitionKey; - } - if (sequenceNumber != null) { - $result.sequenceNumber = sequenceNumber; - } - if (schemaViolationReason != null) { - $result.schemaViolationReason = schemaViolationReason; - } - if (messageTransformationFailureReason != null) { - $result.messageTransformationFailureReason = + final result = create(); + if (streamArn != null) result.streamArn = streamArn; + if (partitionKey != null) result.partitionKey = partitionKey; + if (sequenceNumber != null) result.sequenceNumber = sequenceNumber; + if (schemaViolationReason != null) + result.schemaViolationReason = schemaViolationReason; + if (messageTransformationFailureReason != null) + result.messageTransformationFailureReason = messageTransformationFailureReason; - } - if (apiViolationReason != null) { - $result.apiViolationReason = apiViolationReason; - } - return $result; + if (apiViolationReason != null) + result.apiViolationReason = apiViolationReason; + return result; } - IngestionFailureEvent_AwsKinesisFailureReason._() : super(); + + IngestionFailureEvent_AwsKinesisFailureReason._(); + factory IngestionFailureEvent_AwsKinesisFailureReason.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionFailureEvent_AwsKinesisFailureReason.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionFailureEvent_AwsKinesisFailureReason.fromJson( + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core .Map<$core.int, IngestionFailureEvent_AwsKinesisFailureReason_Reason> @@ -2785,11 +2544,13 @@ class IngestionFailureEvent_AwsKinesisFailureReason updates(message as IngestionFailureEvent_AwsKinesisFailureReason)) as IngestionFailureEvent_AwsKinesisFailureReason; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent_AwsKinesisFailureReason create() => IngestionFailureEvent_AwsKinesisFailureReason._(); + @$core.override IngestionFailureEvent_AwsKinesisFailureReason createEmptyInstance() => create(); static $pb.PbList @@ -2810,10 +2571,7 @@ class IngestionFailureEvent_AwsKinesisFailureReason @$pb.TagNumber(1) $core.String get streamArn => $_getSZ(0); @$pb.TagNumber(1) - set streamArn($core.String v) { - $_setString(0, v); - } - + set streamArn($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasStreamArn() => $_has(0); @$pb.TagNumber(1) @@ -2823,10 +2581,7 @@ class IngestionFailureEvent_AwsKinesisFailureReason @$pb.TagNumber(2) $core.String get partitionKey => $_getSZ(1); @$pb.TagNumber(2) - set partitionKey($core.String v) { - $_setString(1, v); - } - + set partitionKey($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasPartitionKey() => $_has(1); @$pb.TagNumber(2) @@ -2836,10 +2591,7 @@ class IngestionFailureEvent_AwsKinesisFailureReason @$pb.TagNumber(3) $core.String get sequenceNumber => $_getSZ(2); @$pb.TagNumber(3) - set sequenceNumber($core.String v) { - $_setString(2, v); - } - + set sequenceNumber($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasSequenceNumber() => $_has(2); @$pb.TagNumber(3) @@ -2850,10 +2602,9 @@ class IngestionFailureEvent_AwsKinesisFailureReason IngestionFailureEvent_SchemaViolationReason get schemaViolationReason => $_getN(3); @$pb.TagNumber(4) - set schemaViolationReason(IngestionFailureEvent_SchemaViolationReason v) { - $_setField(4, v); - } - + set schemaViolationReason( + IngestionFailureEvent_SchemaViolationReason value) => + $_setField(4, value); @$pb.TagNumber(4) $core.bool hasSchemaViolationReason() => $_has(3); @$pb.TagNumber(4) @@ -2869,10 +2620,8 @@ class IngestionFailureEvent_AwsKinesisFailureReason get messageTransformationFailureReason => $_getN(4); @$pb.TagNumber(5) set messageTransformationFailureReason( - IngestionFailureEvent_MessageTransformationFailureReason v) { - $_setField(5, v); - } - + IngestionFailureEvent_MessageTransformationFailureReason value) => + $_setField(5, value); @$pb.TagNumber(5) $core.bool hasMessageTransformationFailureReason() => $_has(4); @$pb.TagNumber(5) @@ -2887,10 +2636,8 @@ class IngestionFailureEvent_AwsKinesisFailureReason @$pb.TagNumber(6) IngestionFailureEvent_ApiViolationReason get apiViolationReason => $_getN(5); @$pb.TagNumber(6) - set apiViolationReason(IngestionFailureEvent_ApiViolationReason v) { - $_setField(6, v); - } - + set apiViolationReason(IngestionFailureEvent_ApiViolationReason value) => + $_setField(6, value); @$pb.TagNumber(6) $core.bool hasApiViolationReason() => $_has(5); @$pb.TagNumber(6) @@ -2921,37 +2668,28 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { IngestionFailureEvent_ConfluentCloudFailureReason? confluentCloudFailure, IngestionFailureEvent_AwsKinesisFailureReason? awsKinesisFailure, }) { - final $result = create(); - if (topic != null) { - $result.topic = topic; - } - if (errorMessage != null) { - $result.errorMessage = errorMessage; - } - if (cloudStorageFailure != null) { - $result.cloudStorageFailure = cloudStorageFailure; - } - if (awsMskFailure != null) { - $result.awsMskFailure = awsMskFailure; - } - if (azureEventHubsFailure != null) { - $result.azureEventHubsFailure = azureEventHubsFailure; - } - if (confluentCloudFailure != null) { - $result.confluentCloudFailure = confluentCloudFailure; - } - if (awsKinesisFailure != null) { - $result.awsKinesisFailure = awsKinesisFailure; - } - return $result; - } - IngestionFailureEvent._() : super(); - factory IngestionFailureEvent.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory IngestionFailureEvent.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + final result = create(); + if (topic != null) result.topic = topic; + if (errorMessage != null) result.errorMessage = errorMessage; + if (cloudStorageFailure != null) + result.cloudStorageFailure = cloudStorageFailure; + if (awsMskFailure != null) result.awsMskFailure = awsMskFailure; + if (azureEventHubsFailure != null) + result.azureEventHubsFailure = azureEventHubsFailure; + if (confluentCloudFailure != null) + result.confluentCloudFailure = confluentCloudFailure; + if (awsKinesisFailure != null) result.awsKinesisFailure = awsKinesisFailure; + return result; + } + + IngestionFailureEvent._(); + + factory IngestionFailureEvent.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IngestionFailureEvent.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, IngestionFailureEvent_Failure> _IngestionFailureEvent_FailureByTag = { @@ -2996,10 +2734,12 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as IngestionFailureEvent)) as IngestionFailureEvent; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static IngestionFailureEvent create() => IngestionFailureEvent._(); + @$core.override IngestionFailureEvent createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -3017,10 +2757,7 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get topic => $_getSZ(0); @$pb.TagNumber(1) - set topic($core.String v) { - $_setString(0, v); - } - + set topic($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasTopic() => $_has(0); @$pb.TagNumber(1) @@ -3030,10 +2767,7 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get errorMessage => $_getSZ(1); @$pb.TagNumber(2) - set errorMessage($core.String v) { - $_setString(1, v); - } - + set errorMessage($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasErrorMessage() => $_has(1); @$pb.TagNumber(2) @@ -3044,10 +2778,8 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { IngestionFailureEvent_CloudStorageFailure get cloudStorageFailure => $_getN(2); @$pb.TagNumber(3) - set cloudStorageFailure(IngestionFailureEvent_CloudStorageFailure v) { - $_setField(3, v); - } - + set cloudStorageFailure(IngestionFailureEvent_CloudStorageFailure value) => + $_setField(3, value); @$pb.TagNumber(3) $core.bool hasCloudStorageFailure() => $_has(2); @$pb.TagNumber(3) @@ -3060,10 +2792,8 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { @$pb.TagNumber(4) IngestionFailureEvent_AwsMskFailureReason get awsMskFailure => $_getN(3); @$pb.TagNumber(4) - set awsMskFailure(IngestionFailureEvent_AwsMskFailureReason v) { - $_setField(4, v); - } - + set awsMskFailure(IngestionFailureEvent_AwsMskFailureReason value) => + $_setField(4, value); @$pb.TagNumber(4) $core.bool hasAwsMskFailure() => $_has(3); @$pb.TagNumber(4) @@ -3078,10 +2808,8 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { $_getN(4); @$pb.TagNumber(5) set azureEventHubsFailure( - IngestionFailureEvent_AzureEventHubsFailureReason v) { - $_setField(5, v); - } - + IngestionFailureEvent_AzureEventHubsFailureReason value) => + $_setField(5, value); @$pb.TagNumber(5) $core.bool hasAzureEventHubsFailure() => $_has(4); @$pb.TagNumber(5) @@ -3096,10 +2824,8 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { $_getN(5); @$pb.TagNumber(6) set confluentCloudFailure( - IngestionFailureEvent_ConfluentCloudFailureReason v) { - $_setField(6, v); - } - + IngestionFailureEvent_ConfluentCloudFailureReason value) => + $_setField(6, value); @$pb.TagNumber(6) $core.bool hasConfluentCloudFailure() => $_has(5); @$pb.TagNumber(6) @@ -3113,10 +2839,8 @@ class IngestionFailureEvent extends $pb.GeneratedMessage { IngestionFailureEvent_AwsKinesisFailureReason get awsKinesisFailure => $_getN(6); @$pb.TagNumber(7) - set awsKinesisFailure(IngestionFailureEvent_AwsKinesisFailureReason v) { - $_setField(7, v); - } - + set awsKinesisFailure(IngestionFailureEvent_AwsKinesisFailureReason value) => + $_setField(7, value); @$pb.TagNumber(7) $core.bool hasAwsKinesisFailure() => $_has(6); @$pb.TagNumber(7) @@ -3133,22 +2857,20 @@ class JavaScriptUDF extends $pb.GeneratedMessage { $core.String? functionName, $core.String? code, }) { - final $result = create(); - if (functionName != null) { - $result.functionName = functionName; - } - if (code != null) { - $result.code = code; - } - return $result; + final result = create(); + if (functionName != null) result.functionName = functionName; + if (code != null) result.code = code; + return result; } - JavaScriptUDF._() : super(); - factory JavaScriptUDF.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory JavaScriptUDF.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + JavaScriptUDF._(); + + factory JavaScriptUDF.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory JavaScriptUDF.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'JavaScriptUDF', @@ -3166,10 +2888,12 @@ class JavaScriptUDF extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as JavaScriptUDF)) as JavaScriptUDF; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static JavaScriptUDF create() => JavaScriptUDF._(); + @$core.override JavaScriptUDF createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -3183,10 +2907,7 @@ class JavaScriptUDF extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get functionName => $_getSZ(0); @$pb.TagNumber(1) - set functionName($core.String v) { - $_setString(0, v); - } - + set functionName($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasFunctionName() => $_has(0); @$pb.TagNumber(1) @@ -3225,10 +2946,7 @@ class JavaScriptUDF extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get code => $_getSZ(1); @$pb.TagNumber(2) - set code($core.String v) { - $_setString(1, v); - } - + set code($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasCode() => $_has(1); @$pb.TagNumber(2) @@ -3238,29 +2956,30 @@ class JavaScriptUDF extends $pb.GeneratedMessage { /// Configuration for making inferences using arbitrary JSON payloads. class AIInference_UnstructuredInference extends $pb.GeneratedMessage { factory AIInference_UnstructuredInference({ - $4.Struct? parameters, + $3.Struct? parameters, }) { - final $result = create(); - if (parameters != null) { - $result.parameters = parameters; - } - return $result; + final result = create(); + if (parameters != null) result.parameters = parameters; + return result; } - AIInference_UnstructuredInference._() : super(); - factory AIInference_UnstructuredInference.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory AIInference_UnstructuredInference.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + AIInference_UnstructuredInference._(); + + factory AIInference_UnstructuredInference.fromBuffer( + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory AIInference_UnstructuredInference.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'AIInference.UnstructuredInference', package: const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), createEmptyInstance: create) - ..aOM<$4.Struct>(1, _omitFieldNames ? '' : 'parameters', - subBuilder: $4.Struct.create) + ..aOM<$3.Struct>(1, _omitFieldNames ? '' : 'parameters', + subBuilder: $3.Struct.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -3273,11 +2992,13 @@ class AIInference_UnstructuredInference extends $pb.GeneratedMessage { updates(message as AIInference_UnstructuredInference)) as AIInference_UnstructuredInference; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static AIInference_UnstructuredInference create() => AIInference_UnstructuredInference._(); + @$core.override AIInference_UnstructuredInference createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -3291,18 +3012,15 @@ class AIInference_UnstructuredInference extends $pb.GeneratedMessage { /// The parameters object is combined with the data field of the Pub/Sub /// message to form the inference request. @$pb.TagNumber(1) - $4.Struct get parameters => $_getN(0); + $3.Struct get parameters => $_getN(0); @$pb.TagNumber(1) - set parameters($4.Struct v) { - $_setField(1, v); - } - + set parameters($3.Struct value) => $_setField(1, value); @$pb.TagNumber(1) $core.bool hasParameters() => $_has(0); @$pb.TagNumber(1) void clearParameters() => $_clearField(1); @$pb.TagNumber(1) - $4.Struct ensureParameters() => $_ensure(0); + $3.Struct ensureParameters() => $_ensure(0); } enum AIInference_InferenceMode { unstructuredInference, notSet } @@ -3314,25 +3032,23 @@ class AIInference extends $pb.GeneratedMessage { AIInference_UnstructuredInference? unstructuredInference, $core.String? serviceAccountEmail, }) { - final $result = create(); - if (endpoint != null) { - $result.endpoint = endpoint; - } - if (unstructuredInference != null) { - $result.unstructuredInference = unstructuredInference; - } - if (serviceAccountEmail != null) { - $result.serviceAccountEmail = serviceAccountEmail; - } - return $result; + final result = create(); + if (endpoint != null) result.endpoint = endpoint; + if (unstructuredInference != null) + result.unstructuredInference = unstructuredInference; + if (serviceAccountEmail != null) + result.serviceAccountEmail = serviceAccountEmail; + return result; } - AIInference._() : super(); - factory AIInference.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory AIInference.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + AIInference._(); + + factory AIInference.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory AIInference.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, AIInference_InferenceMode> _AIInference_InferenceModeByTag = { @@ -3359,10 +3075,12 @@ class AIInference extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as AIInference)) as AIInference; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static AIInference create() => AIInference._(); + @$core.override AIInference createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -3381,10 +3099,7 @@ class AIInference extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get endpoint => $_getSZ(0); @$pb.TagNumber(1) - set endpoint($core.String v) { - $_setString(0, v); - } - + set endpoint($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasEndpoint() => $_has(0); @$pb.TagNumber(1) @@ -3394,10 +3109,8 @@ class AIInference extends $pb.GeneratedMessage { @$pb.TagNumber(2) AIInference_UnstructuredInference get unstructuredInference => $_getN(1); @$pb.TagNumber(2) - set unstructuredInference(AIInference_UnstructuredInference v) { - $_setField(2, v); - } - + set unstructuredInference(AIInference_UnstructuredInference value) => + $_setField(2, value); @$pb.TagNumber(2) $core.bool hasUnstructuredInference() => $_has(1); @$pb.TagNumber(2) @@ -3415,10 +3128,7 @@ class AIInference extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get serviceAccountEmail => $_getSZ(2); @$pb.TagNumber(3) - set serviceAccountEmail($core.String v) { - $_setString(2, v); - } - + set serviceAccountEmail($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasServiceAccountEmail() => $_has(2); @$pb.TagNumber(3) @@ -3435,29 +3145,22 @@ class MessageTransform extends $pb.GeneratedMessage { $core.bool? disabled, AIInference? aiInference, }) { - final $result = create(); - if (javascriptUdf != null) { - $result.javascriptUdf = javascriptUdf; - } - if (enabled != null) { - // ignore: deprecated_member_use_from_same_package - $result.enabled = enabled; - } - if (disabled != null) { - $result.disabled = disabled; - } - if (aiInference != null) { - $result.aiInference = aiInference; - } - return $result; + final result = create(); + if (javascriptUdf != null) result.javascriptUdf = javascriptUdf; + if (enabled != null) result.enabled = enabled; + if (disabled != null) result.disabled = disabled; + if (aiInference != null) result.aiInference = aiInference; + return result; } - MessageTransform._() : super(); - factory MessageTransform.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory MessageTransform.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + MessageTransform._(); + + factory MessageTransform.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory MessageTransform.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, MessageTransform_Transform> _MessageTransform_TransformByTag = { @@ -3486,10 +3189,12 @@ class MessageTransform extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as MessageTransform)) as MessageTransform; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static MessageTransform create() => MessageTransform._(); + @$core.override MessageTransform createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -3507,10 +3212,7 @@ class MessageTransform extends $pb.GeneratedMessage { @$pb.TagNumber(2) JavaScriptUDF get javascriptUdf => $_getN(0); @$pb.TagNumber(2) - set javascriptUdf(JavaScriptUDF v) { - $_setField(2, v); - } - + set javascriptUdf(JavaScriptUDF value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasJavascriptUdf() => $_has(0); @$pb.TagNumber(2) @@ -3525,10 +3227,7 @@ class MessageTransform extends $pb.GeneratedMessage { $core.bool get enabled => $_getBF(1); @$core.Deprecated('This field is deprecated.') @$pb.TagNumber(3) - set enabled($core.bool v) { - $_setBool(1, v); - } - + set enabled($core.bool value) => $_setBool(1, value); @$core.Deprecated('This field is deprecated.') @$pb.TagNumber(3) $core.bool hasEnabled() => $_has(1); @@ -3541,10 +3240,7 @@ class MessageTransform extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.bool get disabled => $_getBF(2); @$pb.TagNumber(4) - set disabled($core.bool v) { - $_setBool(2, v); - } - + set disabled($core.bool value) => $_setBool(2, value); @$pb.TagNumber(4) $core.bool hasDisabled() => $_has(2); @$pb.TagNumber(4) @@ -3556,10 +3252,7 @@ class MessageTransform extends $pb.GeneratedMessage { @$pb.TagNumber(6) AIInference get aiInference => $_getN(3); @$pb.TagNumber(6) - set aiInference(AIInference v) { - $_setField(6, v); - } - + set aiInference(AIInference value) => $_setField(6, value); @$pb.TagNumber(6) $core.bool hasAiInference() => $_has(3); @$pb.TagNumber(6) @@ -3577,55 +3270,39 @@ class Topic extends $pb.GeneratedMessage { $core.String? kmsKeyName, SchemaSettings? schemaSettings, $core.bool? satisfiesPzs, - $5.Duration? messageRetentionDuration, + $4.Duration? messageRetentionDuration, Topic_State? state, IngestionDataSourceSettings? ingestionDataSourceSettings, $core.Iterable? messageTransforms, $core.Iterable<$core.MapEntry<$core.String, $core.String>>? tags, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (labels != null) { - $result.labels.addEntries(labels); - } - if (messageStoragePolicy != null) { - $result.messageStoragePolicy = messageStoragePolicy; - } - if (kmsKeyName != null) { - $result.kmsKeyName = kmsKeyName; - } - if (schemaSettings != null) { - $result.schemaSettings = schemaSettings; - } - if (satisfiesPzs != null) { - $result.satisfiesPzs = satisfiesPzs; - } - if (messageRetentionDuration != null) { - $result.messageRetentionDuration = messageRetentionDuration; - } - if (state != null) { - $result.state = state; - } - if (ingestionDataSourceSettings != null) { - $result.ingestionDataSourceSettings = ingestionDataSourceSettings; - } - if (messageTransforms != null) { - $result.messageTransforms.addAll(messageTransforms); - } - if (tags != null) { - $result.tags.addEntries(tags); - } - return $result; - } - Topic._() : super(); - factory Topic.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Topic.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + final result = create(); + if (name != null) result.name = name; + if (labels != null) result.labels.addEntries(labels); + if (messageStoragePolicy != null) + result.messageStoragePolicy = messageStoragePolicy; + if (kmsKeyName != null) result.kmsKeyName = kmsKeyName; + if (schemaSettings != null) result.schemaSettings = schemaSettings; + if (satisfiesPzs != null) result.satisfiesPzs = satisfiesPzs; + if (messageRetentionDuration != null) + result.messageRetentionDuration = messageRetentionDuration; + if (state != null) result.state = state; + if (ingestionDataSourceSettings != null) + result.ingestionDataSourceSettings = ingestionDataSourceSettings; + if (messageTransforms != null) + result.messageTransforms.addAll(messageTransforms); + if (tags != null) result.tags.addEntries(tags); + return result; + } + + Topic._(); + + factory Topic.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Topic.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Topic', @@ -3645,8 +3322,8 @@ class Topic extends $pb.GeneratedMessage { ..aOM(6, _omitFieldNames ? '' : 'schemaSettings', subBuilder: SchemaSettings.create) ..aOB(7, _omitFieldNames ? '' : 'satisfiesPzs') - ..aOM<$5.Duration>(8, _omitFieldNames ? '' : 'messageRetentionDuration', - subBuilder: $5.Duration.create) + ..aOM<$4.Duration>(8, _omitFieldNames ? '' : 'messageRetentionDuration', + subBuilder: $4.Duration.create) ..e(9, _omitFieldNames ? '' : 'state', $pb.PbFieldType.OE, defaultOrMaker: Topic_State.STATE_UNSPECIFIED, valueOf: Topic_State.valueOf, @@ -3670,10 +3347,12 @@ class Topic extends $pb.GeneratedMessage { Topic copyWith(void Function(Topic) updates) => super.copyWith((message) => updates(message as Topic)) as Topic; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Topic create() => Topic._(); + @$core.override Topic createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -3690,10 +3369,7 @@ class Topic extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -3710,10 +3386,7 @@ class Topic extends $pb.GeneratedMessage { @$pb.TagNumber(3) MessageStoragePolicy get messageStoragePolicy => $_getN(2); @$pb.TagNumber(3) - set messageStoragePolicy(MessageStoragePolicy v) { - $_setField(3, v); - } - + set messageStoragePolicy(MessageStoragePolicy value) => $_setField(3, value); @$pb.TagNumber(3) $core.bool hasMessageStoragePolicy() => $_has(2); @$pb.TagNumber(3) @@ -3728,10 +3401,7 @@ class Topic extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.String get kmsKeyName => $_getSZ(3); @$pb.TagNumber(5) - set kmsKeyName($core.String v) { - $_setString(3, v); - } - + set kmsKeyName($core.String value) => $_setString(3, value); @$pb.TagNumber(5) $core.bool hasKmsKeyName() => $_has(3); @$pb.TagNumber(5) @@ -3741,10 +3411,7 @@ class Topic extends $pb.GeneratedMessage { @$pb.TagNumber(6) SchemaSettings get schemaSettings => $_getN(4); @$pb.TagNumber(6) - set schemaSettings(SchemaSettings v) { - $_setField(6, v); - } - + set schemaSettings(SchemaSettings value) => $_setField(6, value); @$pb.TagNumber(6) $core.bool hasSchemaSettings() => $_has(4); @$pb.TagNumber(6) @@ -3757,10 +3424,7 @@ class Topic extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.bool get satisfiesPzs => $_getBF(5); @$pb.TagNumber(7) - set satisfiesPzs($core.bool v) { - $_setBool(5, v); - } - + set satisfiesPzs($core.bool value) => $_setBool(5, value); @$pb.TagNumber(7) $core.bool hasSatisfiesPzs() => $_has(5); @$pb.TagNumber(7) @@ -3776,27 +3440,21 @@ class Topic extends $pb.GeneratedMessage { /// not set, message retention is controlled by settings on individual /// subscriptions. Cannot be more than 31 days or less than 10 minutes. @$pb.TagNumber(8) - $5.Duration get messageRetentionDuration => $_getN(6); + $4.Duration get messageRetentionDuration => $_getN(6); @$pb.TagNumber(8) - set messageRetentionDuration($5.Duration v) { - $_setField(8, v); - } - + set messageRetentionDuration($4.Duration value) => $_setField(8, value); @$pb.TagNumber(8) $core.bool hasMessageRetentionDuration() => $_has(6); @$pb.TagNumber(8) void clearMessageRetentionDuration() => $_clearField(8); @$pb.TagNumber(8) - $5.Duration ensureMessageRetentionDuration() => $_ensure(6); + $4.Duration ensureMessageRetentionDuration() => $_ensure(6); /// Output only. An output-only field indicating the state of the topic. @$pb.TagNumber(9) Topic_State get state => $_getN(7); @$pb.TagNumber(9) - set state(Topic_State v) { - $_setField(9, v); - } - + set state(Topic_State value) => $_setField(9, value); @$pb.TagNumber(9) $core.bool hasState() => $_has(7); @$pb.TagNumber(9) @@ -3806,10 +3464,8 @@ class Topic extends $pb.GeneratedMessage { @$pb.TagNumber(10) IngestionDataSourceSettings get ingestionDataSourceSettings => $_getN(8); @$pb.TagNumber(10) - set ingestionDataSourceSettings(IngestionDataSourceSettings v) { - $_setField(10, v); - } - + set ingestionDataSourceSettings(IngestionDataSourceSettings value) => + $_setField(10, value); @$pb.TagNumber(10) $core.bool hasIngestionDataSourceSettings() => $_has(8); @$pb.TagNumber(10) @@ -3846,34 +3502,26 @@ class PubsubMessage extends $pb.GeneratedMessage { $core.List<$core.int>? data, $core.Iterable<$core.MapEntry<$core.String, $core.String>>? attributes, $core.String? messageId, - $3.Timestamp? publishTime, + $2.Timestamp? publishTime, $core.String? orderingKey, }) { - final $result = create(); - if (data != null) { - $result.data = data; - } - if (attributes != null) { - $result.attributes.addEntries(attributes); - } - if (messageId != null) { - $result.messageId = messageId; - } - if (publishTime != null) { - $result.publishTime = publishTime; - } - if (orderingKey != null) { - $result.orderingKey = orderingKey; - } - return $result; + final result = create(); + if (data != null) result.data = data; + if (attributes != null) result.attributes.addEntries(attributes); + if (messageId != null) result.messageId = messageId; + if (publishTime != null) result.publishTime = publishTime; + if (orderingKey != null) result.orderingKey = orderingKey; + return result; } - PubsubMessage._() : super(); - factory PubsubMessage.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PubsubMessage.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PubsubMessage._(); + + factory PubsubMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PubsubMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PubsubMessage', @@ -3888,8 +3536,8 @@ class PubsubMessage extends $pb.GeneratedMessage { valueFieldType: $pb.PbFieldType.OS, packageName: const $pb.PackageName('google.pubsub.v1')) ..aOS(3, _omitFieldNames ? '' : 'messageId') - ..aOM<$3.Timestamp>(4, _omitFieldNames ? '' : 'publishTime', - subBuilder: $3.Timestamp.create) + ..aOM<$2.Timestamp>(4, _omitFieldNames ? '' : 'publishTime', + subBuilder: $2.Timestamp.create) ..aOS(5, _omitFieldNames ? '' : 'orderingKey') ..hasRequiredFields = false; @@ -3900,10 +3548,12 @@ class PubsubMessage extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PubsubMessage)) as PubsubMessage; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PubsubMessage create() => PubsubMessage._(); + @$core.override PubsubMessage createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -3917,10 +3567,7 @@ class PubsubMessage extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.List<$core.int> get data => $_getN(0); @$pb.TagNumber(1) - set data($core.List<$core.int> v) { - $_setBytes(0, v); - } - + set data($core.List<$core.int> value) => $_setBytes(0, value); @$pb.TagNumber(1) $core.bool hasData() => $_has(0); @$pb.TagNumber(1) @@ -3939,10 +3586,7 @@ class PubsubMessage extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get messageId => $_getSZ(2); @$pb.TagNumber(3) - set messageId($core.String v) { - $_setString(2, v); - } - + set messageId($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasMessageId() => $_has(2); @$pb.TagNumber(3) @@ -3952,18 +3596,15 @@ class PubsubMessage extends $pb.GeneratedMessage { /// it receives the `Publish` call. It must not be populated by the /// publisher in a `Publish` call. @$pb.TagNumber(4) - $3.Timestamp get publishTime => $_getN(3); + $2.Timestamp get publishTime => $_getN(3); @$pb.TagNumber(4) - set publishTime($3.Timestamp v) { - $_setField(4, v); - } - + set publishTime($2.Timestamp value) => $_setField(4, value); @$pb.TagNumber(4) $core.bool hasPublishTime() => $_has(3); @$pb.TagNumber(4) void clearPublishTime() => $_clearField(4); @$pb.TagNumber(4) - $3.Timestamp ensurePublishTime() => $_ensure(3); + $2.Timestamp ensurePublishTime() => $_ensure(3); /// Optional. If non-empty, identifies related messages for which publish order /// should be respected. If a `Subscription` has `enable_message_ordering` set @@ -3976,10 +3617,7 @@ class PubsubMessage extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.String get orderingKey => $_getSZ(4); @$pb.TagNumber(5) - set orderingKey($core.String v) { - $_setString(4, v); - } - + set orderingKey($core.String value) => $_setString(4, value); @$pb.TagNumber(5) $core.bool hasOrderingKey() => $_has(4); @$pb.TagNumber(5) @@ -3991,19 +3629,19 @@ class GetTopicRequest extends $pb.GeneratedMessage { factory GetTopicRequest({ $core.String? topic, }) { - final $result = create(); - if (topic != null) { - $result.topic = topic; - } - return $result; + final result = create(); + if (topic != null) result.topic = topic; + return result; } - GetTopicRequest._() : super(); - factory GetTopicRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory GetTopicRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + GetTopicRequest._(); + + factory GetTopicRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory GetTopicRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'GetTopicRequest', @@ -4020,10 +3658,12 @@ class GetTopicRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as GetTopicRequest)) as GetTopicRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static GetTopicRequest create() => GetTopicRequest._(); + @$core.override GetTopicRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4037,10 +3677,7 @@ class GetTopicRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get topic => $_getSZ(0); @$pb.TagNumber(1) - set topic($core.String v) { - $_setString(0, v); - } - + set topic($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasTopic() => $_has(0); @$pb.TagNumber(1) @@ -4051,24 +3688,22 @@ class GetTopicRequest extends $pb.GeneratedMessage { class UpdateTopicRequest extends $pb.GeneratedMessage { factory UpdateTopicRequest({ Topic? topic, - $6.FieldMask? updateMask, + $5.FieldMask? updateMask, }) { - final $result = create(); - if (topic != null) { - $result.topic = topic; - } - if (updateMask != null) { - $result.updateMask = updateMask; - } - return $result; + final result = create(); + if (topic != null) result.topic = topic; + if (updateMask != null) result.updateMask = updateMask; + return result; } - UpdateTopicRequest._() : super(); - factory UpdateTopicRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory UpdateTopicRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + UpdateTopicRequest._(); + + factory UpdateTopicRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory UpdateTopicRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'UpdateTopicRequest', @@ -4076,8 +3711,8 @@ class UpdateTopicRequest extends $pb.GeneratedMessage { const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), createEmptyInstance: create) ..aOM(1, _omitFieldNames ? '' : 'topic', subBuilder: Topic.create) - ..aOM<$6.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', - subBuilder: $6.FieldMask.create) + ..aOM<$5.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', + subBuilder: $5.FieldMask.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -4087,10 +3722,12 @@ class UpdateTopicRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as UpdateTopicRequest)) as UpdateTopicRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UpdateTopicRequest create() => UpdateTopicRequest._(); + @$core.override UpdateTopicRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4103,10 +3740,7 @@ class UpdateTopicRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) Topic get topic => $_getN(0); @$pb.TagNumber(1) - set topic(Topic v) { - $_setField(1, v); - } - + set topic(Topic value) => $_setField(1, value); @$pb.TagNumber(1) $core.bool hasTopic() => $_has(0); @$pb.TagNumber(1) @@ -4120,18 +3754,15 @@ class UpdateTopicRequest extends $pb.GeneratedMessage { /// the `topic` provided above, then the updated value is determined by the /// policy configured at the project or organization level. @$pb.TagNumber(2) - $6.FieldMask get updateMask => $_getN(1); + $5.FieldMask get updateMask => $_getN(1); @$pb.TagNumber(2) - set updateMask($6.FieldMask v) { - $_setField(2, v); - } - + set updateMask($5.FieldMask value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasUpdateMask() => $_has(1); @$pb.TagNumber(2) void clearUpdateMask() => $_clearField(2); @$pb.TagNumber(2) - $6.FieldMask ensureUpdateMask() => $_ensure(1); + $5.FieldMask ensureUpdateMask() => $_ensure(1); } /// Request for the Publish method. @@ -4140,22 +3771,20 @@ class PublishRequest extends $pb.GeneratedMessage { $core.String? topic, $core.Iterable? messages, }) { - final $result = create(); - if (topic != null) { - $result.topic = topic; - } - if (messages != null) { - $result.messages.addAll(messages); - } - return $result; + final result = create(); + if (topic != null) result.topic = topic; + if (messages != null) result.messages.addAll(messages); + return result; } - PublishRequest._() : super(); - factory PublishRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PublishRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PublishRequest._(); + + factory PublishRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PublishRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PublishRequest', @@ -4175,10 +3804,12 @@ class PublishRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PublishRequest)) as PublishRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PublishRequest create() => PublishRequest._(); + @$core.override PublishRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4192,10 +3823,7 @@ class PublishRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get topic => $_getSZ(0); @$pb.TagNumber(1) - set topic($core.String v) { - $_setString(0, v); - } - + set topic($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasTopic() => $_has(0); @$pb.TagNumber(1) @@ -4211,19 +3839,19 @@ class PublishResponse extends $pb.GeneratedMessage { factory PublishResponse({ $core.Iterable<$core.String>? messageIds, }) { - final $result = create(); - if (messageIds != null) { - $result.messageIds.addAll(messageIds); - } - return $result; + final result = create(); + if (messageIds != null) result.messageIds.addAll(messageIds); + return result; } - PublishResponse._() : super(); - factory PublishResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PublishResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PublishResponse._(); + + factory PublishResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PublishResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PublishResponse', @@ -4240,10 +3868,12 @@ class PublishResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PublishResponse)) as PublishResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PublishResponse create() => PublishResponse._(); + @$core.override PublishResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4266,25 +3896,21 @@ class ListTopicsRequest extends $pb.GeneratedMessage { $core.int? pageSize, $core.String? pageToken, }) { - final $result = create(); - if (project != null) { - $result.project = project; - } - if (pageSize != null) { - $result.pageSize = pageSize; - } - if (pageToken != null) { - $result.pageToken = pageToken; - } - return $result; + final result = create(); + if (project != null) result.project = project; + if (pageSize != null) result.pageSize = pageSize; + if (pageToken != null) result.pageToken = pageToken; + return result; } - ListTopicsRequest._() : super(); - factory ListTopicsRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListTopicsRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListTopicsRequest._(); + + factory ListTopicsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListTopicsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListTopicsRequest', @@ -4303,10 +3929,12 @@ class ListTopicsRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListTopicsRequest)) as ListTopicsRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListTopicsRequest create() => ListTopicsRequest._(); + @$core.override ListTopicsRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4320,10 +3948,7 @@ class ListTopicsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get project => $_getSZ(0); @$pb.TagNumber(1) - set project($core.String v) { - $_setString(0, v); - } - + set project($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasProject() => $_has(0); @$pb.TagNumber(1) @@ -4333,10 +3958,7 @@ class ListTopicsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.int get pageSize => $_getIZ(1); @$pb.TagNumber(2) - set pageSize($core.int v) { - $_setSignedInt32(1, v); - } - + set pageSize($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasPageSize() => $_has(1); @$pb.TagNumber(2) @@ -4348,10 +3970,7 @@ class ListTopicsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get pageToken => $_getSZ(2); @$pb.TagNumber(3) - set pageToken($core.String v) { - $_setString(2, v); - } - + set pageToken($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasPageToken() => $_has(2); @$pb.TagNumber(3) @@ -4364,22 +3983,20 @@ class ListTopicsResponse extends $pb.GeneratedMessage { $core.Iterable? topics, $core.String? nextPageToken, }) { - final $result = create(); - if (topics != null) { - $result.topics.addAll(topics); - } - if (nextPageToken != null) { - $result.nextPageToken = nextPageToken; - } - return $result; + final result = create(); + if (topics != null) result.topics.addAll(topics); + if (nextPageToken != null) result.nextPageToken = nextPageToken; + return result; } - ListTopicsResponse._() : super(); - factory ListTopicsResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListTopicsResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListTopicsResponse._(); + + factory ListTopicsResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListTopicsResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListTopicsResponse', @@ -4398,10 +4015,12 @@ class ListTopicsResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListTopicsResponse)) as ListTopicsResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListTopicsResponse create() => ListTopicsResponse._(); + @$core.override ListTopicsResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4419,10 +4038,7 @@ class ListTopicsResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get nextPageToken => $_getSZ(1); @$pb.TagNumber(2) - set nextPageToken($core.String v) { - $_setString(1, v); - } - + set nextPageToken($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasNextPageToken() => $_has(1); @$pb.TagNumber(2) @@ -4436,25 +4052,21 @@ class ListTopicSubscriptionsRequest extends $pb.GeneratedMessage { $core.int? pageSize, $core.String? pageToken, }) { - final $result = create(); - if (topic != null) { - $result.topic = topic; - } - if (pageSize != null) { - $result.pageSize = pageSize; - } - if (pageToken != null) { - $result.pageToken = pageToken; - } - return $result; + final result = create(); + if (topic != null) result.topic = topic; + if (pageSize != null) result.pageSize = pageSize; + if (pageToken != null) result.pageToken = pageToken; + return result; } - ListTopicSubscriptionsRequest._() : super(); - factory ListTopicSubscriptionsRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListTopicSubscriptionsRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListTopicSubscriptionsRequest._(); + + factory ListTopicSubscriptionsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListTopicSubscriptionsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListTopicSubscriptionsRequest', @@ -4476,11 +4088,13 @@ class ListTopicSubscriptionsRequest extends $pb.GeneratedMessage { (message) => updates(message as ListTopicSubscriptionsRequest)) as ListTopicSubscriptionsRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListTopicSubscriptionsRequest create() => ListTopicSubscriptionsRequest._(); + @$core.override ListTopicSubscriptionsRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4494,10 +4108,7 @@ class ListTopicSubscriptionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get topic => $_getSZ(0); @$pb.TagNumber(1) - set topic($core.String v) { - $_setString(0, v); - } - + set topic($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasTopic() => $_has(0); @$pb.TagNumber(1) @@ -4507,10 +4118,7 @@ class ListTopicSubscriptionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.int get pageSize => $_getIZ(1); @$pb.TagNumber(2) - set pageSize($core.int v) { - $_setSignedInt32(1, v); - } - + set pageSize($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasPageSize() => $_has(1); @$pb.TagNumber(2) @@ -4522,10 +4130,7 @@ class ListTopicSubscriptionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get pageToken => $_getSZ(2); @$pb.TagNumber(3) - set pageToken($core.String v) { - $_setString(2, v); - } - + set pageToken($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasPageToken() => $_has(2); @$pb.TagNumber(3) @@ -4538,22 +4143,20 @@ class ListTopicSubscriptionsResponse extends $pb.GeneratedMessage { $core.Iterable<$core.String>? subscriptions, $core.String? nextPageToken, }) { - final $result = create(); - if (subscriptions != null) { - $result.subscriptions.addAll(subscriptions); - } - if (nextPageToken != null) { - $result.nextPageToken = nextPageToken; - } - return $result; + final result = create(); + if (subscriptions != null) result.subscriptions.addAll(subscriptions); + if (nextPageToken != null) result.nextPageToken = nextPageToken; + return result; } - ListTopicSubscriptionsResponse._() : super(); - factory ListTopicSubscriptionsResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListTopicSubscriptionsResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListTopicSubscriptionsResponse._(); + + factory ListTopicSubscriptionsResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListTopicSubscriptionsResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListTopicSubscriptionsResponse', @@ -4574,11 +4177,13 @@ class ListTopicSubscriptionsResponse extends $pb.GeneratedMessage { (message) => updates(message as ListTopicSubscriptionsResponse)) as ListTopicSubscriptionsResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListTopicSubscriptionsResponse create() => ListTopicSubscriptionsResponse._(); + @$core.override ListTopicSubscriptionsResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4598,10 +4203,7 @@ class ListTopicSubscriptionsResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get nextPageToken => $_getSZ(1); @$pb.TagNumber(2) - set nextPageToken($core.String v) { - $_setString(1, v); - } - + set nextPageToken($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasNextPageToken() => $_has(1); @$pb.TagNumber(2) @@ -4615,25 +4217,21 @@ class ListTopicSnapshotsRequest extends $pb.GeneratedMessage { $core.int? pageSize, $core.String? pageToken, }) { - final $result = create(); - if (topic != null) { - $result.topic = topic; - } - if (pageSize != null) { - $result.pageSize = pageSize; - } - if (pageToken != null) { - $result.pageToken = pageToken; - } - return $result; + final result = create(); + if (topic != null) result.topic = topic; + if (pageSize != null) result.pageSize = pageSize; + if (pageToken != null) result.pageToken = pageToken; + return result; } - ListTopicSnapshotsRequest._() : super(); - factory ListTopicSnapshotsRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListTopicSnapshotsRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListTopicSnapshotsRequest._(); + + factory ListTopicSnapshotsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListTopicSnapshotsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListTopicSnapshotsRequest', @@ -4654,10 +4252,12 @@ class ListTopicSnapshotsRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListTopicSnapshotsRequest)) as ListTopicSnapshotsRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListTopicSnapshotsRequest create() => ListTopicSnapshotsRequest._(); + @$core.override ListTopicSnapshotsRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4671,10 +4271,7 @@ class ListTopicSnapshotsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get topic => $_getSZ(0); @$pb.TagNumber(1) - set topic($core.String v) { - $_setString(0, v); - } - + set topic($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasTopic() => $_has(0); @$pb.TagNumber(1) @@ -4684,10 +4281,7 @@ class ListTopicSnapshotsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.int get pageSize => $_getIZ(1); @$pb.TagNumber(2) - set pageSize($core.int v) { - $_setSignedInt32(1, v); - } - + set pageSize($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasPageSize() => $_has(1); @$pb.TagNumber(2) @@ -4699,10 +4293,7 @@ class ListTopicSnapshotsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get pageToken => $_getSZ(2); @$pb.TagNumber(3) - set pageToken($core.String v) { - $_setString(2, v); - } - + set pageToken($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasPageToken() => $_has(2); @$pb.TagNumber(3) @@ -4715,22 +4306,20 @@ class ListTopicSnapshotsResponse extends $pb.GeneratedMessage { $core.Iterable<$core.String>? snapshots, $core.String? nextPageToken, }) { - final $result = create(); - if (snapshots != null) { - $result.snapshots.addAll(snapshots); - } - if (nextPageToken != null) { - $result.nextPageToken = nextPageToken; - } - return $result; + final result = create(); + if (snapshots != null) result.snapshots.addAll(snapshots); + if (nextPageToken != null) result.nextPageToken = nextPageToken; + return result; } - ListTopicSnapshotsResponse._() : super(); - factory ListTopicSnapshotsResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListTopicSnapshotsResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListTopicSnapshotsResponse._(); + + factory ListTopicSnapshotsResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListTopicSnapshotsResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListTopicSnapshotsResponse', @@ -4751,10 +4340,12 @@ class ListTopicSnapshotsResponse extends $pb.GeneratedMessage { (message) => updates(message as ListTopicSnapshotsResponse)) as ListTopicSnapshotsResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListTopicSnapshotsResponse create() => ListTopicSnapshotsResponse._(); + @$core.override ListTopicSnapshotsResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4773,10 +4364,7 @@ class ListTopicSnapshotsResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get nextPageToken => $_getSZ(1); @$pb.TagNumber(2) - set nextPageToken($core.String v) { - $_setString(1, v); - } - + set nextPageToken($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasNextPageToken() => $_has(1); @$pb.TagNumber(2) @@ -4788,19 +4376,19 @@ class DeleteTopicRequest extends $pb.GeneratedMessage { factory DeleteTopicRequest({ $core.String? topic, }) { - final $result = create(); - if (topic != null) { - $result.topic = topic; - } - return $result; + final result = create(); + if (topic != null) result.topic = topic; + return result; } - DeleteTopicRequest._() : super(); - factory DeleteTopicRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DeleteTopicRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + DeleteTopicRequest._(); + + factory DeleteTopicRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DeleteTopicRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'DeleteTopicRequest', @@ -4817,10 +4405,12 @@ class DeleteTopicRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as DeleteTopicRequest)) as DeleteTopicRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DeleteTopicRequest create() => DeleteTopicRequest._(); + @$core.override DeleteTopicRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4834,10 +4424,7 @@ class DeleteTopicRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get topic => $_getSZ(0); @$pb.TagNumber(1) - set topic($core.String v) { - $_setString(0, v); - } - + set topic($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasTopic() => $_has(0); @$pb.TagNumber(1) @@ -4849,19 +4436,19 @@ class DetachSubscriptionRequest extends $pb.GeneratedMessage { factory DetachSubscriptionRequest({ $core.String? subscription, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + return result; } - DetachSubscriptionRequest._() : super(); - factory DetachSubscriptionRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DetachSubscriptionRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + DetachSubscriptionRequest._(); + + factory DetachSubscriptionRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DetachSubscriptionRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'DetachSubscriptionRequest', @@ -4880,10 +4467,12 @@ class DetachSubscriptionRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as DetachSubscriptionRequest)) as DetachSubscriptionRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DetachSubscriptionRequest create() => DetachSubscriptionRequest._(); + @$core.override DetachSubscriptionRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4897,10 +4486,7 @@ class DetachSubscriptionRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -4911,13 +4497,15 @@ class DetachSubscriptionRequest extends $pb.GeneratedMessage { /// Reserved for future use. class DetachSubscriptionResponse extends $pb.GeneratedMessage { factory DetachSubscriptionResponse() => create(); - DetachSubscriptionResponse._() : super(); - factory DetachSubscriptionResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DetachSubscriptionResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + DetachSubscriptionResponse._(); + + factory DetachSubscriptionResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DetachSubscriptionResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'DetachSubscriptionResponse', @@ -4936,10 +4524,12 @@ class DetachSubscriptionResponse extends $pb.GeneratedMessage { (message) => updates(message as DetachSubscriptionResponse)) as DetachSubscriptionResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DetachSubscriptionResponse create() => DetachSubscriptionResponse._(); + @$core.override DetachSubscriptionResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -4956,23 +4546,21 @@ class Subscription_AnalyticsHubSubscriptionInfo extends $pb.GeneratedMessage { $core.String? listing, $core.String? subscription, }) { - final $result = create(); - if (listing != null) { - $result.listing = listing; - } - if (subscription != null) { - $result.subscription = subscription; - } - return $result; + final result = create(); + if (listing != null) result.listing = listing; + if (subscription != null) result.subscription = subscription; + return result; } - Subscription_AnalyticsHubSubscriptionInfo._() : super(); + + Subscription_AnalyticsHubSubscriptionInfo._(); + factory Subscription_AnalyticsHubSubscriptionInfo.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Subscription_AnalyticsHubSubscriptionInfo.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Subscription_AnalyticsHubSubscriptionInfo.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Subscription.AnalyticsHubSubscriptionInfo', @@ -4993,11 +4581,13 @@ class Subscription_AnalyticsHubSubscriptionInfo extends $pb.GeneratedMessage { updates(message as Subscription_AnalyticsHubSubscriptionInfo)) as Subscription_AnalyticsHubSubscriptionInfo; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Subscription_AnalyticsHubSubscriptionInfo create() => Subscription_AnalyticsHubSubscriptionInfo._(); + @$core.override Subscription_AnalyticsHubSubscriptionInfo createEmptyInstance() => create(); static $pb.PbList createRepeated() => @@ -5014,10 +4604,7 @@ class Subscription_AnalyticsHubSubscriptionInfo extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get listing => $_getSZ(0); @$pb.TagNumber(1) - set listing($core.String v) { - $_setString(0, v); - } - + set listing($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasListing() => $_has(0); @$pb.TagNumber(1) @@ -5029,10 +4616,7 @@ class Subscription_AnalyticsHubSubscriptionInfo extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get subscription => $_getSZ(1); @$pb.TagNumber(2) - set subscription($core.String v) { - $_setString(1, v); - } - + set subscription($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasSubscription() => $_has(1); @$pb.TagNumber(2) @@ -5049,7 +4633,7 @@ class Subscription extends $pb.GeneratedMessage { PushConfig? pushConfig, $core.int? ackDeadlineSeconds, $core.bool? retainAckedMessages, - $5.Duration? messageRetentionDuration, + $4.Duration? messageRetentionDuration, $core.Iterable<$core.MapEntry<$core.String, $core.String>>? labels, $core.bool? enableMessageOrdering, ExpirationPolicy? expirationPolicy, @@ -5058,7 +4642,7 @@ class Subscription extends $pb.GeneratedMessage { RetryPolicy? retryPolicy, $core.bool? detached, $core.bool? enableExactlyOnceDelivery, - $5.Duration? topicMessageRetentionDuration, + $4.Duration? topicMessageRetentionDuration, BigQueryConfig? bigqueryConfig, Subscription_State? state, CloudStorageConfig? cloudStorageConfig, @@ -5067,82 +4651,49 @@ class Subscription extends $pb.GeneratedMessage { $core.Iterable<$core.MapEntry<$core.String, $core.String>>? tags, BigtableConfig? bigtableConfig, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (topic != null) { - $result.topic = topic; - } - if (pushConfig != null) { - $result.pushConfig = pushConfig; - } - if (ackDeadlineSeconds != null) { - $result.ackDeadlineSeconds = ackDeadlineSeconds; - } - if (retainAckedMessages != null) { - $result.retainAckedMessages = retainAckedMessages; - } - if (messageRetentionDuration != null) { - $result.messageRetentionDuration = messageRetentionDuration; - } - if (labels != null) { - $result.labels.addEntries(labels); - } - if (enableMessageOrdering != null) { - $result.enableMessageOrdering = enableMessageOrdering; - } - if (expirationPolicy != null) { - $result.expirationPolicy = expirationPolicy; - } - if (filter != null) { - $result.filter = filter; - } - if (deadLetterPolicy != null) { - $result.deadLetterPolicy = deadLetterPolicy; - } - if (retryPolicy != null) { - $result.retryPolicy = retryPolicy; - } - if (detached != null) { - $result.detached = detached; - } - if (enableExactlyOnceDelivery != null) { - $result.enableExactlyOnceDelivery = enableExactlyOnceDelivery; - } - if (topicMessageRetentionDuration != null) { - $result.topicMessageRetentionDuration = topicMessageRetentionDuration; - } - if (bigqueryConfig != null) { - $result.bigqueryConfig = bigqueryConfig; - } - if (state != null) { - $result.state = state; - } - if (cloudStorageConfig != null) { - $result.cloudStorageConfig = cloudStorageConfig; - } - if (analyticsHubSubscriptionInfo != null) { - $result.analyticsHubSubscriptionInfo = analyticsHubSubscriptionInfo; - } - if (messageTransforms != null) { - $result.messageTransforms.addAll(messageTransforms); - } - if (tags != null) { - $result.tags.addEntries(tags); - } - if (bigtableConfig != null) { - $result.bigtableConfig = bigtableConfig; - } - return $result; - } - Subscription._() : super(); - factory Subscription.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Subscription.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + final result = create(); + if (name != null) result.name = name; + if (topic != null) result.topic = topic; + if (pushConfig != null) result.pushConfig = pushConfig; + if (ackDeadlineSeconds != null) + result.ackDeadlineSeconds = ackDeadlineSeconds; + if (retainAckedMessages != null) + result.retainAckedMessages = retainAckedMessages; + if (messageRetentionDuration != null) + result.messageRetentionDuration = messageRetentionDuration; + if (labels != null) result.labels.addEntries(labels); + if (enableMessageOrdering != null) + result.enableMessageOrdering = enableMessageOrdering; + if (expirationPolicy != null) result.expirationPolicy = expirationPolicy; + if (filter != null) result.filter = filter; + if (deadLetterPolicy != null) result.deadLetterPolicy = deadLetterPolicy; + if (retryPolicy != null) result.retryPolicy = retryPolicy; + if (detached != null) result.detached = detached; + if (enableExactlyOnceDelivery != null) + result.enableExactlyOnceDelivery = enableExactlyOnceDelivery; + if (topicMessageRetentionDuration != null) + result.topicMessageRetentionDuration = topicMessageRetentionDuration; + if (bigqueryConfig != null) result.bigqueryConfig = bigqueryConfig; + if (state != null) result.state = state; + if (cloudStorageConfig != null) + result.cloudStorageConfig = cloudStorageConfig; + if (analyticsHubSubscriptionInfo != null) + result.analyticsHubSubscriptionInfo = analyticsHubSubscriptionInfo; + if (messageTransforms != null) + result.messageTransforms.addAll(messageTransforms); + if (tags != null) result.tags.addEntries(tags); + if (bigtableConfig != null) result.bigtableConfig = bigtableConfig; + return result; + } + + Subscription._(); + + factory Subscription.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Subscription.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Subscription', @@ -5156,8 +4707,8 @@ class Subscription extends $pb.GeneratedMessage { ..a<$core.int>( 5, _omitFieldNames ? '' : 'ackDeadlineSeconds', $pb.PbFieldType.O3) ..aOB(7, _omitFieldNames ? '' : 'retainAckedMessages') - ..aOM<$5.Duration>(8, _omitFieldNames ? '' : 'messageRetentionDuration', - subBuilder: $5.Duration.create) + ..aOM<$4.Duration>(8, _omitFieldNames ? '' : 'messageRetentionDuration', + subBuilder: $4.Duration.create) ..m<$core.String, $core.String>(9, _omitFieldNames ? '' : 'labels', entryClassName: 'Subscription.LabelsEntry', keyFieldType: $pb.PbFieldType.OS, @@ -5173,9 +4724,9 @@ class Subscription extends $pb.GeneratedMessage { subBuilder: RetryPolicy.create) ..aOB(15, _omitFieldNames ? '' : 'detached') ..aOB(16, _omitFieldNames ? '' : 'enableExactlyOnceDelivery') - ..aOM<$5.Duration>( + ..aOM<$4.Duration>( 17, _omitFieldNames ? '' : 'topicMessageRetentionDuration', - subBuilder: $5.Duration.create) + subBuilder: $4.Duration.create) ..aOM(18, _omitFieldNames ? '' : 'bigqueryConfig', subBuilder: BigQueryConfig.create) ..e( @@ -5207,10 +4758,12 @@ class Subscription extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as Subscription)) as Subscription; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Subscription create() => Subscription._(); + @$core.override Subscription createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -5228,10 +4781,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -5243,10 +4793,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get topic => $_getSZ(1); @$pb.TagNumber(2) - set topic($core.String v) { - $_setString(1, v); - } - + set topic($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasTopic() => $_has(1); @$pb.TagNumber(2) @@ -5257,10 +4804,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(4) PushConfig get pushConfig => $_getN(2); @$pb.TagNumber(4) - set pushConfig(PushConfig v) { - $_setField(4, v); - } - + set pushConfig(PushConfig value) => $_setField(4, value); @$pb.TagNumber(4) $core.bool hasPushConfig() => $_has(2); @$pb.TagNumber(4) @@ -5291,10 +4835,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.int get ackDeadlineSeconds => $_getIZ(3); @$pb.TagNumber(5) - set ackDeadlineSeconds($core.int v) { - $_setSignedInt32(3, v); - } - + set ackDeadlineSeconds($core.int value) => $_setSignedInt32(3, value); @$pb.TagNumber(5) $core.bool hasAckDeadlineSeconds() => $_has(3); @$pb.TagNumber(5) @@ -5309,10 +4850,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.bool get retainAckedMessages => $_getBF(4); @$pb.TagNumber(7) - set retainAckedMessages($core.bool v) { - $_setBool(4, v); - } - + set retainAckedMessages($core.bool value) => $_setBool(4, value); @$pb.TagNumber(7) $core.bool hasRetainAckedMessages() => $_has(4); @$pb.TagNumber(7) @@ -5324,18 +4862,15 @@ class Subscription extends $pb.GeneratedMessage { /// and thus configures how far back in time a `Seek` can be done. Defaults to /// 7 days. Cannot be more than 31 days or less than 10 minutes. @$pb.TagNumber(8) - $5.Duration get messageRetentionDuration => $_getN(5); + $4.Duration get messageRetentionDuration => $_getN(5); @$pb.TagNumber(8) - set messageRetentionDuration($5.Duration v) { - $_setField(8, v); - } - + set messageRetentionDuration($4.Duration value) => $_setField(8, value); @$pb.TagNumber(8) $core.bool hasMessageRetentionDuration() => $_has(5); @$pb.TagNumber(8) void clearMessageRetentionDuration() => $_clearField(8); @$pb.TagNumber(8) - $5.Duration ensureMessageRetentionDuration() => $_ensure(5); + $4.Duration ensureMessageRetentionDuration() => $_ensure(5); /// Optional. See [Creating and managing /// labels](https://cloud.google.com/pubsub/docs/labels). @@ -5349,10 +4884,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(10) $core.bool get enableMessageOrdering => $_getBF(7); @$pb.TagNumber(10) - set enableMessageOrdering($core.bool v) { - $_setBool(7, v); - } - + set enableMessageOrdering($core.bool value) => $_setBool(7, value); @$pb.TagNumber(10) $core.bool hasEnableMessageOrdering() => $_has(7); @$pb.TagNumber(10) @@ -5368,10 +4900,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(11) ExpirationPolicy get expirationPolicy => $_getN(8); @$pb.TagNumber(11) - set expirationPolicy(ExpirationPolicy v) { - $_setField(11, v); - } - + set expirationPolicy(ExpirationPolicy value) => $_setField(11, value); @$pb.TagNumber(11) $core.bool hasExpirationPolicy() => $_has(8); @$pb.TagNumber(11) @@ -5387,10 +4916,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(12) $core.String get filter => $_getSZ(9); @$pb.TagNumber(12) - set filter($core.String v) { - $_setString(9, v); - } - + set filter($core.String value) => $_setString(9, value); @$pb.TagNumber(12) $core.bool hasFilter() => $_has(9); @$pb.TagNumber(12) @@ -5407,10 +4933,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(13) DeadLetterPolicy get deadLetterPolicy => $_getN(10); @$pb.TagNumber(13) - set deadLetterPolicy(DeadLetterPolicy v) { - $_setField(13, v); - } - + set deadLetterPolicy(DeadLetterPolicy value) => $_setField(13, value); @$pb.TagNumber(13) $core.bool hasDeadLetterPolicy() => $_has(10); @$pb.TagNumber(13) @@ -5428,10 +4951,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(14) RetryPolicy get retryPolicy => $_getN(11); @$pb.TagNumber(14) - set retryPolicy(RetryPolicy v) { - $_setField(14, v); - } - + set retryPolicy(RetryPolicy value) => $_setField(14, value); @$pb.TagNumber(14) $core.bool hasRetryPolicy() => $_has(11); @$pb.TagNumber(14) @@ -5447,10 +4967,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(15) $core.bool get detached => $_getBF(12); @$pb.TagNumber(15) - set detached($core.bool v) { - $_setBool(12, v); - } - + set detached($core.bool value) => $_setBool(12, value); @$pb.TagNumber(15) $core.bool hasDetached() => $_has(12); @$pb.TagNumber(15) @@ -5471,10 +4988,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(16) $core.bool get enableExactlyOnceDelivery => $_getBF(13); @$pb.TagNumber(16) - set enableExactlyOnceDelivery($core.bool v) { - $_setBool(13, v); - } - + set enableExactlyOnceDelivery($core.bool value) => $_setBool(13, value); @$pb.TagNumber(16) $core.bool hasEnableExactlyOnceDelivery() => $_has(13); @$pb.TagNumber(16) @@ -5487,28 +5001,22 @@ class Subscription extends $pb.GeneratedMessage { /// the `message_retention_duration` field in `Topic`. This field is set only /// in responses from the server; it is ignored if it is set in any requests. @$pb.TagNumber(17) - $5.Duration get topicMessageRetentionDuration => $_getN(14); + $4.Duration get topicMessageRetentionDuration => $_getN(14); @$pb.TagNumber(17) - set topicMessageRetentionDuration($5.Duration v) { - $_setField(17, v); - } - + set topicMessageRetentionDuration($4.Duration value) => $_setField(17, value); @$pb.TagNumber(17) $core.bool hasTopicMessageRetentionDuration() => $_has(14); @$pb.TagNumber(17) void clearTopicMessageRetentionDuration() => $_clearField(17); @$pb.TagNumber(17) - $5.Duration ensureTopicMessageRetentionDuration() => $_ensure(14); + $4.Duration ensureTopicMessageRetentionDuration() => $_ensure(14); /// Optional. If delivery to BigQuery is used with this subscription, this /// field is used to configure it. @$pb.TagNumber(18) BigQueryConfig get bigqueryConfig => $_getN(15); @$pb.TagNumber(18) - set bigqueryConfig(BigQueryConfig v) { - $_setField(18, v); - } - + set bigqueryConfig(BigQueryConfig value) => $_setField(18, value); @$pb.TagNumber(18) $core.bool hasBigqueryConfig() => $_has(15); @$pb.TagNumber(18) @@ -5521,10 +5029,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(19) Subscription_State get state => $_getN(16); @$pb.TagNumber(19) - set state(Subscription_State v) { - $_setField(19, v); - } - + set state(Subscription_State value) => $_setField(19, value); @$pb.TagNumber(19) $core.bool hasState() => $_has(16); @$pb.TagNumber(19) @@ -5535,10 +5040,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(22) CloudStorageConfig get cloudStorageConfig => $_getN(17); @$pb.TagNumber(22) - set cloudStorageConfig(CloudStorageConfig v) { - $_setField(22, v); - } - + set cloudStorageConfig(CloudStorageConfig value) => $_setField(22, value); @$pb.TagNumber(22) $core.bool hasCloudStorageConfig() => $_has(17); @$pb.TagNumber(22) @@ -5553,10 +5055,8 @@ class Subscription extends $pb.GeneratedMessage { $_getN(18); @$pb.TagNumber(23) set analyticsHubSubscriptionInfo( - Subscription_AnalyticsHubSubscriptionInfo v) { - $_setField(23, v); - } - + Subscription_AnalyticsHubSubscriptionInfo value) => + $_setField(23, value); @$pb.TagNumber(23) $core.bool hasAnalyticsHubSubscriptionInfo() => $_has(18); @$pb.TagNumber(23) @@ -5584,10 +5084,7 @@ class Subscription extends $pb.GeneratedMessage { @$pb.TagNumber(27) BigtableConfig get bigtableConfig => $_getN(21); @$pb.TagNumber(27) - set bigtableConfig(BigtableConfig v) { - $_setField(27, v); - } - + set bigtableConfig(BigtableConfig value) => $_setField(27, value); @$pb.TagNumber(27) $core.bool hasBigtableConfig() => $_has(21); @$pb.TagNumber(27) @@ -5609,35 +5106,33 @@ class Subscription extends $pb.GeneratedMessage { /// delay can be more or less than configured backoff. class RetryPolicy extends $pb.GeneratedMessage { factory RetryPolicy({ - $5.Duration? minimumBackoff, - $5.Duration? maximumBackoff, + $4.Duration? minimumBackoff, + $4.Duration? maximumBackoff, }) { - final $result = create(); - if (minimumBackoff != null) { - $result.minimumBackoff = minimumBackoff; - } - if (maximumBackoff != null) { - $result.maximumBackoff = maximumBackoff; - } - return $result; + final result = create(); + if (minimumBackoff != null) result.minimumBackoff = minimumBackoff; + if (maximumBackoff != null) result.maximumBackoff = maximumBackoff; + return result; } - RetryPolicy._() : super(); - factory RetryPolicy.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory RetryPolicy.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + RetryPolicy._(); + + factory RetryPolicy.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory RetryPolicy.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'RetryPolicy', package: const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), createEmptyInstance: create) - ..aOM<$5.Duration>(1, _omitFieldNames ? '' : 'minimumBackoff', - subBuilder: $5.Duration.create) - ..aOM<$5.Duration>(2, _omitFieldNames ? '' : 'maximumBackoff', - subBuilder: $5.Duration.create) + ..aOM<$4.Duration>(1, _omitFieldNames ? '' : 'minimumBackoff', + subBuilder: $4.Duration.create) + ..aOM<$4.Duration>(2, _omitFieldNames ? '' : 'maximumBackoff', + subBuilder: $4.Duration.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -5647,10 +5142,12 @@ class RetryPolicy extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as RetryPolicy)) as RetryPolicy; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static RetryPolicy create() => RetryPolicy._(); + @$core.override RetryPolicy createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -5661,35 +5158,29 @@ class RetryPolicy extends $pb.GeneratedMessage { /// Optional. The minimum delay between consecutive deliveries of a given /// message. Value should be between 0 and 600 seconds. Defaults to 10 seconds. @$pb.TagNumber(1) - $5.Duration get minimumBackoff => $_getN(0); + $4.Duration get minimumBackoff => $_getN(0); @$pb.TagNumber(1) - set minimumBackoff($5.Duration v) { - $_setField(1, v); - } - + set minimumBackoff($4.Duration value) => $_setField(1, value); @$pb.TagNumber(1) $core.bool hasMinimumBackoff() => $_has(0); @$pb.TagNumber(1) void clearMinimumBackoff() => $_clearField(1); @$pb.TagNumber(1) - $5.Duration ensureMinimumBackoff() => $_ensure(0); + $4.Duration ensureMinimumBackoff() => $_ensure(0); /// Optional. The maximum delay between consecutive deliveries of a given /// message. Value should be between 0 and 600 seconds. Defaults to 600 /// seconds. @$pb.TagNumber(2) - $5.Duration get maximumBackoff => $_getN(1); + $4.Duration get maximumBackoff => $_getN(1); @$pb.TagNumber(2) - set maximumBackoff($5.Duration v) { - $_setField(2, v); - } - + set maximumBackoff($4.Duration value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasMaximumBackoff() => $_has(1); @$pb.TagNumber(2) void clearMaximumBackoff() => $_clearField(2); @$pb.TagNumber(2) - $5.Duration ensureMaximumBackoff() => $_ensure(1); + $4.Duration ensureMaximumBackoff() => $_ensure(1); } /// Dead lettering is done on a best effort basis. The same message might be @@ -5702,22 +5193,21 @@ class DeadLetterPolicy extends $pb.GeneratedMessage { $core.String? deadLetterTopic, $core.int? maxDeliveryAttempts, }) { - final $result = create(); - if (deadLetterTopic != null) { - $result.deadLetterTopic = deadLetterTopic; - } - if (maxDeliveryAttempts != null) { - $result.maxDeliveryAttempts = maxDeliveryAttempts; - } - return $result; + final result = create(); + if (deadLetterTopic != null) result.deadLetterTopic = deadLetterTopic; + if (maxDeliveryAttempts != null) + result.maxDeliveryAttempts = maxDeliveryAttempts; + return result; } - DeadLetterPolicy._() : super(); - factory DeadLetterPolicy.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DeadLetterPolicy.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + DeadLetterPolicy._(); + + factory DeadLetterPolicy.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DeadLetterPolicy.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'DeadLetterPolicy', @@ -5736,10 +5226,12 @@ class DeadLetterPolicy extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as DeadLetterPolicy)) as DeadLetterPolicy; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DeadLetterPolicy create() => DeadLetterPolicy._(); + @$core.override DeadLetterPolicy createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -5760,10 +5252,7 @@ class DeadLetterPolicy extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get deadLetterTopic => $_getSZ(0); @$pb.TagNumber(1) - set deadLetterTopic($core.String v) { - $_setString(0, v); - } - + set deadLetterTopic($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasDeadLetterTopic() => $_has(0); @$pb.TagNumber(1) @@ -5785,10 +5274,7 @@ class DeadLetterPolicy extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.int get maxDeliveryAttempts => $_getIZ(1); @$pb.TagNumber(2) - set maxDeliveryAttempts($core.int v) { - $_setSignedInt32(1, v); - } - + set maxDeliveryAttempts($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasMaxDeliveryAttempts() => $_has(1); @$pb.TagNumber(2) @@ -5799,29 +5285,29 @@ class DeadLetterPolicy extends $pb.GeneratedMessage { /// automatic resource deletion). class ExpirationPolicy extends $pb.GeneratedMessage { factory ExpirationPolicy({ - $5.Duration? ttl, + $4.Duration? ttl, }) { - final $result = create(); - if (ttl != null) { - $result.ttl = ttl; - } - return $result; + final result = create(); + if (ttl != null) result.ttl = ttl; + return result; } - ExpirationPolicy._() : super(); - factory ExpirationPolicy.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ExpirationPolicy.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ExpirationPolicy._(); + + factory ExpirationPolicy.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ExpirationPolicy.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ExpirationPolicy', package: const $pb.PackageName(_omitMessageNames ? '' : 'google.pubsub.v1'), createEmptyInstance: create) - ..aOM<$5.Duration>(1, _omitFieldNames ? '' : 'ttl', - subBuilder: $5.Duration.create) + ..aOM<$4.Duration>(1, _omitFieldNames ? '' : 'ttl', + subBuilder: $4.Duration.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -5831,10 +5317,12 @@ class ExpirationPolicy extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ExpirationPolicy)) as ExpirationPolicy; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ExpirationPolicy create() => ExpirationPolicy._(); + @$core.override ExpirationPolicy createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -5850,18 +5338,15 @@ class ExpirationPolicy extends $pb.GeneratedMessage { /// associated resource, as well. If `ttl` is not set, the associated resource /// never expires. @$pb.TagNumber(1) - $5.Duration get ttl => $_getN(0); + $4.Duration get ttl => $_getN(0); @$pb.TagNumber(1) - set ttl($5.Duration v) { - $_setField(1, v); - } - + set ttl($4.Duration value) => $_setField(1, value); @$pb.TagNumber(1) $core.bool hasTtl() => $_has(0); @$pb.TagNumber(1) void clearTtl() => $_clearField(1); @$pb.TagNumber(1) - $5.Duration ensureTtl() => $_ensure(0); + $4.Duration ensureTtl() => $_ensure(0); } /// Contains information needed for generating an @@ -5872,22 +5357,21 @@ class PushConfig_OidcToken extends $pb.GeneratedMessage { $core.String? serviceAccountEmail, $core.String? audience, }) { - final $result = create(); - if (serviceAccountEmail != null) { - $result.serviceAccountEmail = serviceAccountEmail; - } - if (audience != null) { - $result.audience = audience; - } - return $result; + final result = create(); + if (serviceAccountEmail != null) + result.serviceAccountEmail = serviceAccountEmail; + if (audience != null) result.audience = audience; + return result; } - PushConfig_OidcToken._() : super(); - factory PushConfig_OidcToken.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PushConfig_OidcToken.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PushConfig_OidcToken._(); + + factory PushConfig_OidcToken.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PushConfig_OidcToken.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PushConfig.OidcToken', @@ -5906,10 +5390,12 @@ class PushConfig_OidcToken extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PushConfig_OidcToken)) as PushConfig_OidcToken; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PushConfig_OidcToken create() => PushConfig_OidcToken._(); + @$core.override PushConfig_OidcToken createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -5926,10 +5412,7 @@ class PushConfig_OidcToken extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get serviceAccountEmail => $_getSZ(0); @$pb.TagNumber(1) - set serviceAccountEmail($core.String v) { - $_setString(0, v); - } - + set serviceAccountEmail($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasServiceAccountEmail() => $_has(0); @$pb.TagNumber(1) @@ -5945,10 +5428,7 @@ class PushConfig_OidcToken extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get audience => $_getSZ(1); @$pb.TagNumber(2) - set audience($core.String v) { - $_setString(1, v); - } - + set audience($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasAudience() => $_has(1); @$pb.TagNumber(2) @@ -5960,13 +5440,15 @@ class PushConfig_OidcToken extends $pb.GeneratedMessage { /// (https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#pubsubmessage). class PushConfig_PubsubWrapper extends $pb.GeneratedMessage { factory PushConfig_PubsubWrapper() => create(); - PushConfig_PubsubWrapper._() : super(); - factory PushConfig_PubsubWrapper.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PushConfig_PubsubWrapper.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PushConfig_PubsubWrapper._(); + + factory PushConfig_PubsubWrapper.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PushConfig_PubsubWrapper.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PushConfig.PubsubWrapper', @@ -5984,10 +5466,12 @@ class PushConfig_PubsubWrapper extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PushConfig_PubsubWrapper)) as PushConfig_PubsubWrapper; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PushConfig_PubsubWrapper create() => PushConfig_PubsubWrapper._(); + @$core.override PushConfig_PubsubWrapper createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -6002,19 +5486,19 @@ class PushConfig_NoWrapper extends $pb.GeneratedMessage { factory PushConfig_NoWrapper({ $core.bool? writeMetadata, }) { - final $result = create(); - if (writeMetadata != null) { - $result.writeMetadata = writeMetadata; - } - return $result; + final result = create(); + if (writeMetadata != null) result.writeMetadata = writeMetadata; + return result; } - PushConfig_NoWrapper._() : super(); - factory PushConfig_NoWrapper.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PushConfig_NoWrapper.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PushConfig_NoWrapper._(); + + factory PushConfig_NoWrapper.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PushConfig_NoWrapper.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PushConfig.NoWrapper', @@ -6032,10 +5516,12 @@ class PushConfig_NoWrapper extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PushConfig_NoWrapper)) as PushConfig_NoWrapper; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PushConfig_NoWrapper create() => PushConfig_NoWrapper._(); + @$core.override PushConfig_NoWrapper createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -6050,10 +5536,7 @@ class PushConfig_NoWrapper extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.bool get writeMetadata => $_getBF(0); @$pb.TagNumber(1) - set writeMetadata($core.bool v) { - $_setBool(0, v); - } - + set writeMetadata($core.bool value) => $_setBool(0, value); @$pb.TagNumber(1) $core.bool hasWriteMetadata() => $_has(0); @$pb.TagNumber(1) @@ -6073,31 +5556,23 @@ class PushConfig extends $pb.GeneratedMessage { PushConfig_PubsubWrapper? pubsubWrapper, PushConfig_NoWrapper? noWrapper, }) { - final $result = create(); - if (pushEndpoint != null) { - $result.pushEndpoint = pushEndpoint; - } - if (attributes != null) { - $result.attributes.addEntries(attributes); - } - if (oidcToken != null) { - $result.oidcToken = oidcToken; - } - if (pubsubWrapper != null) { - $result.pubsubWrapper = pubsubWrapper; - } - if (noWrapper != null) { - $result.noWrapper = noWrapper; - } - return $result; + final result = create(); + if (pushEndpoint != null) result.pushEndpoint = pushEndpoint; + if (attributes != null) result.attributes.addEntries(attributes); + if (oidcToken != null) result.oidcToken = oidcToken; + if (pubsubWrapper != null) result.pubsubWrapper = pubsubWrapper; + if (noWrapper != null) result.noWrapper = noWrapper; + return result; } - PushConfig._() : super(); - factory PushConfig.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PushConfig.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PushConfig._(); + + factory PushConfig.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PushConfig.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, PushConfig_AuthenticationMethod> _PushConfig_AuthenticationMethodByTag = { @@ -6137,10 +5612,12 @@ class PushConfig extends $pb.GeneratedMessage { PushConfig copyWith(void Function(PushConfig) updates) => super.copyWith((message) => updates(message as PushConfig)) as PushConfig; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PushConfig create() => PushConfig._(); + @$core.override PushConfig createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -6161,10 +5638,7 @@ class PushConfig extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get pushEndpoint => $_getSZ(0); @$pb.TagNumber(1) - set pushEndpoint($core.String v) { - $_setString(0, v); - } - + set pushEndpoint($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasPushEndpoint() => $_has(0); @$pb.TagNumber(1) @@ -6200,10 +5674,7 @@ class PushConfig extends $pb.GeneratedMessage { @$pb.TagNumber(3) PushConfig_OidcToken get oidcToken => $_getN(2); @$pb.TagNumber(3) - set oidcToken(PushConfig_OidcToken v) { - $_setField(3, v); - } - + set oidcToken(PushConfig_OidcToken value) => $_setField(3, value); @$pb.TagNumber(3) $core.bool hasOidcToken() => $_has(2); @$pb.TagNumber(3) @@ -6217,10 +5688,7 @@ class PushConfig extends $pb.GeneratedMessage { @$pb.TagNumber(4) PushConfig_PubsubWrapper get pubsubWrapper => $_getN(3); @$pb.TagNumber(4) - set pubsubWrapper(PushConfig_PubsubWrapper v) { - $_setField(4, v); - } - + set pubsubWrapper(PushConfig_PubsubWrapper value) => $_setField(4, value); @$pb.TagNumber(4) $core.bool hasPubsubWrapper() => $_has(3); @$pb.TagNumber(4) @@ -6232,10 +5700,7 @@ class PushConfig extends $pb.GeneratedMessage { @$pb.TagNumber(5) PushConfig_NoWrapper get noWrapper => $_getN(4); @$pb.TagNumber(5) - set noWrapper(PushConfig_NoWrapper v) { - $_setField(5, v); - } - + set noWrapper(PushConfig_NoWrapper value) => $_setField(5, value); @$pb.TagNumber(5) $core.bool hasNoWrapper() => $_has(4); @$pb.TagNumber(5) @@ -6255,37 +5720,26 @@ class BigQueryConfig extends $pb.GeneratedMessage { $core.bool? useTableSchema, $core.String? serviceAccountEmail, }) { - final $result = create(); - if (table != null) { - $result.table = table; - } - if (useTopicSchema != null) { - $result.useTopicSchema = useTopicSchema; - } - if (writeMetadata != null) { - $result.writeMetadata = writeMetadata; - } - if (dropUnknownFields != null) { - $result.dropUnknownFields = dropUnknownFields; - } - if (state != null) { - $result.state = state; - } - if (useTableSchema != null) { - $result.useTableSchema = useTableSchema; - } - if (serviceAccountEmail != null) { - $result.serviceAccountEmail = serviceAccountEmail; - } - return $result; - } - BigQueryConfig._() : super(); - factory BigQueryConfig.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory BigQueryConfig.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + final result = create(); + if (table != null) result.table = table; + if (useTopicSchema != null) result.useTopicSchema = useTopicSchema; + if (writeMetadata != null) result.writeMetadata = writeMetadata; + if (dropUnknownFields != null) result.dropUnknownFields = dropUnknownFields; + if (state != null) result.state = state; + if (useTableSchema != null) result.useTableSchema = useTableSchema; + if (serviceAccountEmail != null) + result.serviceAccountEmail = serviceAccountEmail; + return result; + } + + BigQueryConfig._(); + + factory BigQueryConfig.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BigQueryConfig.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'BigQueryConfig', @@ -6312,10 +5766,12 @@ class BigQueryConfig extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as BigQueryConfig)) as BigQueryConfig; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static BigQueryConfig create() => BigQueryConfig._(); + @$core.override BigQueryConfig createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -6329,10 +5785,7 @@ class BigQueryConfig extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get table => $_getSZ(0); @$pb.TagNumber(1) - set table($core.String v) { - $_setString(0, v); - } - + set table($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasTable() => $_has(0); @$pb.TagNumber(1) @@ -6344,10 +5797,7 @@ class BigQueryConfig extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.bool get useTopicSchema => $_getBF(1); @$pb.TagNumber(2) - set useTopicSchema($core.bool v) { - $_setBool(1, v); - } - + set useTopicSchema($core.bool value) => $_setBool(1, value); @$pb.TagNumber(2) $core.bool hasUseTopicSchema() => $_has(1); @$pb.TagNumber(2) @@ -6361,10 +5811,7 @@ class BigQueryConfig extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.bool get writeMetadata => $_getBF(2); @$pb.TagNumber(3) - set writeMetadata($core.bool v) { - $_setBool(2, v); - } - + set writeMetadata($core.bool value) => $_setBool(2, value); @$pb.TagNumber(3) $core.bool hasWriteMetadata() => $_has(2); @$pb.TagNumber(3) @@ -6378,10 +5825,7 @@ class BigQueryConfig extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.bool get dropUnknownFields => $_getBF(3); @$pb.TagNumber(4) - set dropUnknownFields($core.bool v) { - $_setBool(3, v); - } - + set dropUnknownFields($core.bool value) => $_setBool(3, value); @$pb.TagNumber(4) $core.bool hasDropUnknownFields() => $_has(3); @$pb.TagNumber(4) @@ -6392,10 +5836,7 @@ class BigQueryConfig extends $pb.GeneratedMessage { @$pb.TagNumber(5) BigQueryConfig_State get state => $_getN(4); @$pb.TagNumber(5) - set state(BigQueryConfig_State v) { - $_setField(5, v); - } - + set state(BigQueryConfig_State value) => $_setField(5, value); @$pb.TagNumber(5) $core.bool hasState() => $_has(4); @$pb.TagNumber(5) @@ -6407,10 +5848,7 @@ class BigQueryConfig extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.bool get useTableSchema => $_getBF(5); @$pb.TagNumber(6) - set useTableSchema($core.bool v) { - $_setBool(5, v); - } - + set useTableSchema($core.bool value) => $_setBool(5, value); @$pb.TagNumber(6) $core.bool hasUseTableSchema() => $_has(5); @$pb.TagNumber(6) @@ -6425,10 +5863,7 @@ class BigQueryConfig extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.String get serviceAccountEmail => $_getSZ(6); @$pb.TagNumber(7) - set serviceAccountEmail($core.String v) { - $_setString(6, v); - } - + set serviceAccountEmail($core.String value) => $_setString(6, value); @$pb.TagNumber(7) $core.bool hasServiceAccountEmail() => $_has(6); @$pb.TagNumber(7) @@ -6449,31 +5884,24 @@ class BigtableConfig extends $pb.GeneratedMessage { BigtableConfig_State? state, $core.bool? writeMetadata, }) { - final $result = create(); - if (table != null) { - $result.table = table; - } - if (appProfileId != null) { - $result.appProfileId = appProfileId; - } - if (serviceAccountEmail != null) { - $result.serviceAccountEmail = serviceAccountEmail; - } - if (state != null) { - $result.state = state; - } - if (writeMetadata != null) { - $result.writeMetadata = writeMetadata; - } - return $result; + final result = create(); + if (table != null) result.table = table; + if (appProfileId != null) result.appProfileId = appProfileId; + if (serviceAccountEmail != null) + result.serviceAccountEmail = serviceAccountEmail; + if (state != null) result.state = state; + if (writeMetadata != null) result.writeMetadata = writeMetadata; + return result; } - BigtableConfig._() : super(); - factory BigtableConfig.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory BigtableConfig.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + BigtableConfig._(); + + factory BigtableConfig.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BigtableConfig.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'BigtableConfig', @@ -6498,10 +5926,12 @@ class BigtableConfig extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as BigtableConfig)) as BigtableConfig; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static BigtableConfig create() => BigtableConfig._(); + @$core.override BigtableConfig createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -6517,10 +5947,7 @@ class BigtableConfig extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get table => $_getSZ(0); @$pb.TagNumber(1) - set table($core.String v) { - $_setString(0, v); - } - + set table($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasTable() => $_has(0); @$pb.TagNumber(1) @@ -6532,10 +5959,7 @@ class BigtableConfig extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get appProfileId => $_getSZ(1); @$pb.TagNumber(2) - set appProfileId($core.String v) { - $_setString(1, v); - } - + set appProfileId($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasAppProfileId() => $_has(1); @$pb.TagNumber(2) @@ -6550,10 +5974,7 @@ class BigtableConfig extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get serviceAccountEmail => $_getSZ(2); @$pb.TagNumber(3) - set serviceAccountEmail($core.String v) { - $_setString(2, v); - } - + set serviceAccountEmail($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasServiceAccountEmail() => $_has(2); @$pb.TagNumber(3) @@ -6564,10 +5985,7 @@ class BigtableConfig extends $pb.GeneratedMessage { @$pb.TagNumber(4) BigtableConfig_State get state => $_getN(3); @$pb.TagNumber(4) - set state(BigtableConfig_State v) { - $_setField(4, v); - } - + set state(BigtableConfig_State value) => $_setField(4, value); @$pb.TagNumber(4) $core.bool hasState() => $_has(3); @$pb.TagNumber(4) @@ -6582,10 +6000,7 @@ class BigtableConfig extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.bool get writeMetadata => $_getBF(4); @$pb.TagNumber(5) - set writeMetadata($core.bool v) { - $_setBool(4, v); - } - + set writeMetadata($core.bool value) => $_setBool(4, value); @$pb.TagNumber(5) $core.bool hasWriteMetadata() => $_has(4); @$pb.TagNumber(5) @@ -6597,13 +6012,15 @@ class BigtableConfig extends $pb.GeneratedMessage { /// newline. class CloudStorageConfig_TextConfig extends $pb.GeneratedMessage { factory CloudStorageConfig_TextConfig() => create(); - CloudStorageConfig_TextConfig._() : super(); - factory CloudStorageConfig_TextConfig.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory CloudStorageConfig_TextConfig.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + CloudStorageConfig_TextConfig._(); + + factory CloudStorageConfig_TextConfig.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CloudStorageConfig_TextConfig.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'CloudStorageConfig.TextConfig', @@ -6622,11 +6039,13 @@ class CloudStorageConfig_TextConfig extends $pb.GeneratedMessage { (message) => updates(message as CloudStorageConfig_TextConfig)) as CloudStorageConfig_TextConfig; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static CloudStorageConfig_TextConfig create() => CloudStorageConfig_TextConfig._(); + @$core.override CloudStorageConfig_TextConfig createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -6643,22 +6062,20 @@ class CloudStorageConfig_AvroConfig extends $pb.GeneratedMessage { $core.bool? writeMetadata, $core.bool? useTopicSchema, }) { - final $result = create(); - if (writeMetadata != null) { - $result.writeMetadata = writeMetadata; - } - if (useTopicSchema != null) { - $result.useTopicSchema = useTopicSchema; - } - return $result; + final result = create(); + if (writeMetadata != null) result.writeMetadata = writeMetadata; + if (useTopicSchema != null) result.useTopicSchema = useTopicSchema; + return result; } - CloudStorageConfig_AvroConfig._() : super(); - factory CloudStorageConfig_AvroConfig.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory CloudStorageConfig_AvroConfig.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + CloudStorageConfig_AvroConfig._(); + + factory CloudStorageConfig_AvroConfig.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CloudStorageConfig_AvroConfig.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'CloudStorageConfig.AvroConfig', @@ -6679,11 +6096,13 @@ class CloudStorageConfig_AvroConfig extends $pb.GeneratedMessage { (message) => updates(message as CloudStorageConfig_AvroConfig)) as CloudStorageConfig_AvroConfig; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static CloudStorageConfig_AvroConfig create() => CloudStorageConfig_AvroConfig._(); + @$core.override CloudStorageConfig_AvroConfig createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -6701,10 +6120,7 @@ class CloudStorageConfig_AvroConfig extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.bool get writeMetadata => $_getBF(0); @$pb.TagNumber(1) - set writeMetadata($core.bool v) { - $_setBool(0, v); - } - + set writeMetadata($core.bool value) => $_setBool(0, value); @$pb.TagNumber(1) $core.bool hasWriteMetadata() => $_has(0); @$pb.TagNumber(1) @@ -6715,10 +6131,7 @@ class CloudStorageConfig_AvroConfig extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.bool get useTopicSchema => $_getBF(1); @$pb.TagNumber(2) - set useTopicSchema($core.bool v) { - $_setBool(1, v); - } - + set useTopicSchema($core.bool value) => $_setBool(1, value); @$pb.TagNumber(2) $core.bool hasUseTopicSchema() => $_has(1); @$pb.TagNumber(2) @@ -6735,56 +6148,38 @@ class CloudStorageConfig extends $pb.GeneratedMessage { $core.String? filenameSuffix, CloudStorageConfig_TextConfig? textConfig, CloudStorageConfig_AvroConfig? avroConfig, - $5.Duration? maxDuration, + $4.Duration? maxDuration, $fixnum.Int64? maxBytes, $fixnum.Int64? maxMessages, CloudStorageConfig_State? state, $core.String? filenameDatetimeFormat, $core.String? serviceAccountEmail, }) { - final $result = create(); - if (bucket != null) { - $result.bucket = bucket; - } - if (filenamePrefix != null) { - $result.filenamePrefix = filenamePrefix; - } - if (filenameSuffix != null) { - $result.filenameSuffix = filenameSuffix; - } - if (textConfig != null) { - $result.textConfig = textConfig; - } - if (avroConfig != null) { - $result.avroConfig = avroConfig; - } - if (maxDuration != null) { - $result.maxDuration = maxDuration; - } - if (maxBytes != null) { - $result.maxBytes = maxBytes; - } - if (maxMessages != null) { - $result.maxMessages = maxMessages; - } - if (state != null) { - $result.state = state; - } - if (filenameDatetimeFormat != null) { - $result.filenameDatetimeFormat = filenameDatetimeFormat; - } - if (serviceAccountEmail != null) { - $result.serviceAccountEmail = serviceAccountEmail; - } - return $result; - } - CloudStorageConfig._() : super(); - factory CloudStorageConfig.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory CloudStorageConfig.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + final result = create(); + if (bucket != null) result.bucket = bucket; + if (filenamePrefix != null) result.filenamePrefix = filenamePrefix; + if (filenameSuffix != null) result.filenameSuffix = filenameSuffix; + if (textConfig != null) result.textConfig = textConfig; + if (avroConfig != null) result.avroConfig = avroConfig; + if (maxDuration != null) result.maxDuration = maxDuration; + if (maxBytes != null) result.maxBytes = maxBytes; + if (maxMessages != null) result.maxMessages = maxMessages; + if (state != null) result.state = state; + if (filenameDatetimeFormat != null) + result.filenameDatetimeFormat = filenameDatetimeFormat; + if (serviceAccountEmail != null) + result.serviceAccountEmail = serviceAccountEmail; + return result; + } + + CloudStorageConfig._(); + + factory CloudStorageConfig.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CloudStorageConfig.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, CloudStorageConfig_OutputFormat> _CloudStorageConfig_OutputFormatByTag = { @@ -6805,8 +6200,8 @@ class CloudStorageConfig extends $pb.GeneratedMessage { subBuilder: CloudStorageConfig_TextConfig.create) ..aOM(5, _omitFieldNames ? '' : 'avroConfig', subBuilder: CloudStorageConfig_AvroConfig.create) - ..aOM<$5.Duration>(6, _omitFieldNames ? '' : 'maxDuration', - subBuilder: $5.Duration.create) + ..aOM<$4.Duration>(6, _omitFieldNames ? '' : 'maxDuration', + subBuilder: $4.Duration.create) ..aInt64(7, _omitFieldNames ? '' : 'maxBytes') ..aInt64(8, _omitFieldNames ? '' : 'maxMessages') ..e( @@ -6825,10 +6220,12 @@ class CloudStorageConfig extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as CloudStorageConfig)) as CloudStorageConfig; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static CloudStorageConfig create() => CloudStorageConfig._(); + @$core.override CloudStorageConfig createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -6848,10 +6245,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get bucket => $_getSZ(0); @$pb.TagNumber(1) - set bucket($core.String v) { - $_setString(0, v); - } - + set bucket($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasBucket() => $_has(0); @$pb.TagNumber(1) @@ -6862,10 +6256,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get filenamePrefix => $_getSZ(1); @$pb.TagNumber(2) - set filenamePrefix($core.String v) { - $_setString(1, v); - } - + set filenamePrefix($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasFilenamePrefix() => $_has(1); @$pb.TagNumber(2) @@ -6877,10 +6268,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get filenameSuffix => $_getSZ(2); @$pb.TagNumber(3) - set filenameSuffix($core.String v) { - $_setString(2, v); - } - + set filenameSuffix($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasFilenameSuffix() => $_has(2); @$pb.TagNumber(3) @@ -6891,10 +6279,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(4) CloudStorageConfig_TextConfig get textConfig => $_getN(3); @$pb.TagNumber(4) - set textConfig(CloudStorageConfig_TextConfig v) { - $_setField(4, v); - } - + set textConfig(CloudStorageConfig_TextConfig value) => $_setField(4, value); @$pb.TagNumber(4) $core.bool hasTextConfig() => $_has(3); @$pb.TagNumber(4) @@ -6907,10 +6292,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(5) CloudStorageConfig_AvroConfig get avroConfig => $_getN(4); @$pb.TagNumber(5) - set avroConfig(CloudStorageConfig_AvroConfig v) { - $_setField(5, v); - } - + set avroConfig(CloudStorageConfig_AvroConfig value) => $_setField(5, value); @$pb.TagNumber(5) $core.bool hasAvroConfig() => $_has(4); @$pb.TagNumber(5) @@ -6922,18 +6304,15 @@ class CloudStorageConfig extends $pb.GeneratedMessage { /// file is created. Min 1 minute, max 10 minutes, default 5 minutes. May not /// exceed the subscription's acknowledgment deadline. @$pb.TagNumber(6) - $5.Duration get maxDuration => $_getN(5); + $4.Duration get maxDuration => $_getN(5); @$pb.TagNumber(6) - set maxDuration($5.Duration v) { - $_setField(6, v); - } - + set maxDuration($4.Duration value) => $_setField(6, value); @$pb.TagNumber(6) $core.bool hasMaxDuration() => $_has(5); @$pb.TagNumber(6) void clearMaxDuration() => $_clearField(6); @$pb.TagNumber(6) - $5.Duration ensureMaxDuration() => $_ensure(5); + $4.Duration ensureMaxDuration() => $_ensure(5); /// Optional. The maximum bytes that can be written to a Cloud Storage file /// before a new file is created. Min 1 KB, max 10 GiB. The max_bytes limit may @@ -6941,10 +6320,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(7) $fixnum.Int64 get maxBytes => $_getI64(6); @$pb.TagNumber(7) - set maxBytes($fixnum.Int64 v) { - $_setInt64(6, v); - } - + set maxBytes($fixnum.Int64 value) => $_setInt64(6, value); @$pb.TagNumber(7) $core.bool hasMaxBytes() => $_has(6); @$pb.TagNumber(7) @@ -6955,10 +6331,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(8) $fixnum.Int64 get maxMessages => $_getI64(7); @$pb.TagNumber(8) - set maxMessages($fixnum.Int64 v) { - $_setInt64(7, v); - } - + set maxMessages($fixnum.Int64 value) => $_setInt64(7, value); @$pb.TagNumber(8) $core.bool hasMaxMessages() => $_has(7); @$pb.TagNumber(8) @@ -6969,10 +6342,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(9) CloudStorageConfig_State get state => $_getN(8); @$pb.TagNumber(9) - set state(CloudStorageConfig_State v) { - $_setField(9, v); - } - + set state(CloudStorageConfig_State value) => $_setField(9, value); @$pb.TagNumber(9) $core.bool hasState() => $_has(8); @$pb.TagNumber(9) @@ -6984,10 +6354,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(10) $core.String get filenameDatetimeFormat => $_getSZ(9); @$pb.TagNumber(10) - set filenameDatetimeFormat($core.String v) { - $_setString(9, v); - } - + set filenameDatetimeFormat($core.String value) => $_setString(9, value); @$pb.TagNumber(10) $core.bool hasFilenameDatetimeFormat() => $_has(9); @$pb.TagNumber(10) @@ -7002,10 +6369,7 @@ class CloudStorageConfig extends $pb.GeneratedMessage { @$pb.TagNumber(11) $core.String get serviceAccountEmail => $_getSZ(10); @$pb.TagNumber(11) - set serviceAccountEmail($core.String v) { - $_setString(10, v); - } - + set serviceAccountEmail($core.String value) => $_setString(10, value); @$pb.TagNumber(11) $core.bool hasServiceAccountEmail() => $_has(10); @$pb.TagNumber(11) @@ -7019,25 +6383,21 @@ class ReceivedMessage extends $pb.GeneratedMessage { PubsubMessage? message, $core.int? deliveryAttempt, }) { - final $result = create(); - if (ackId != null) { - $result.ackId = ackId; - } - if (message != null) { - $result.message = message; - } - if (deliveryAttempt != null) { - $result.deliveryAttempt = deliveryAttempt; - } - return $result; + final result = create(); + if (ackId != null) result.ackId = ackId; + if (message != null) result.message = message; + if (deliveryAttempt != null) result.deliveryAttempt = deliveryAttempt; + return result; } - ReceivedMessage._() : super(); - factory ReceivedMessage.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ReceivedMessage.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ReceivedMessage._(); + + factory ReceivedMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ReceivedMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ReceivedMessage', @@ -7058,10 +6418,12 @@ class ReceivedMessage extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ReceivedMessage)) as ReceivedMessage; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ReceivedMessage create() => ReceivedMessage._(); + @$core.override ReceivedMessage createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7074,10 +6436,7 @@ class ReceivedMessage extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get ackId => $_getSZ(0); @$pb.TagNumber(1) - set ackId($core.String v) { - $_setString(0, v); - } - + set ackId($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasAckId() => $_has(0); @$pb.TagNumber(1) @@ -7087,10 +6446,7 @@ class ReceivedMessage extends $pb.GeneratedMessage { @$pb.TagNumber(2) PubsubMessage get message => $_getN(1); @$pb.TagNumber(2) - set message(PubsubMessage v) { - $_setField(2, v); - } - + set message(PubsubMessage value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasMessage() => $_has(1); @$pb.TagNumber(2) @@ -7117,10 +6473,7 @@ class ReceivedMessage extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.int get deliveryAttempt => $_getIZ(2); @$pb.TagNumber(3) - set deliveryAttempt($core.int v) { - $_setSignedInt32(2, v); - } - + set deliveryAttempt($core.int value) => $_setSignedInt32(2, value); @$pb.TagNumber(3) $core.bool hasDeliveryAttempt() => $_has(2); @$pb.TagNumber(3) @@ -7132,19 +6485,19 @@ class GetSubscriptionRequest extends $pb.GeneratedMessage { factory GetSubscriptionRequest({ $core.String? subscription, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + return result; } - GetSubscriptionRequest._() : super(); - factory GetSubscriptionRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory GetSubscriptionRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + GetSubscriptionRequest._(); + + factory GetSubscriptionRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory GetSubscriptionRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'GetSubscriptionRequest', @@ -7163,10 +6516,12 @@ class GetSubscriptionRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as GetSubscriptionRequest)) as GetSubscriptionRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static GetSubscriptionRequest create() => GetSubscriptionRequest._(); + @$core.override GetSubscriptionRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7180,10 +6535,7 @@ class GetSubscriptionRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -7194,24 +6546,22 @@ class GetSubscriptionRequest extends $pb.GeneratedMessage { class UpdateSubscriptionRequest extends $pb.GeneratedMessage { factory UpdateSubscriptionRequest({ Subscription? subscription, - $6.FieldMask? updateMask, + $5.FieldMask? updateMask, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - if (updateMask != null) { - $result.updateMask = updateMask; - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + if (updateMask != null) result.updateMask = updateMask; + return result; } - UpdateSubscriptionRequest._() : super(); - factory UpdateSubscriptionRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory UpdateSubscriptionRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + UpdateSubscriptionRequest._(); + + factory UpdateSubscriptionRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory UpdateSubscriptionRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'UpdateSubscriptionRequest', @@ -7220,8 +6570,8 @@ class UpdateSubscriptionRequest extends $pb.GeneratedMessage { createEmptyInstance: create) ..aOM(1, _omitFieldNames ? '' : 'subscription', subBuilder: Subscription.create) - ..aOM<$6.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', - subBuilder: $6.FieldMask.create) + ..aOM<$5.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', + subBuilder: $5.FieldMask.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -7233,10 +6583,12 @@ class UpdateSubscriptionRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as UpdateSubscriptionRequest)) as UpdateSubscriptionRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UpdateSubscriptionRequest create() => UpdateSubscriptionRequest._(); + @$core.override UpdateSubscriptionRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7249,10 +6601,7 @@ class UpdateSubscriptionRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) Subscription get subscription => $_getN(0); @$pb.TagNumber(1) - set subscription(Subscription v) { - $_setField(1, v); - } - + set subscription(Subscription value) => $_setField(1, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -7263,18 +6612,15 @@ class UpdateSubscriptionRequest extends $pb.GeneratedMessage { /// Required. Indicates which fields in the provided subscription to update. /// Must be specified and non-empty. @$pb.TagNumber(2) - $6.FieldMask get updateMask => $_getN(1); + $5.FieldMask get updateMask => $_getN(1); @$pb.TagNumber(2) - set updateMask($6.FieldMask v) { - $_setField(2, v); - } - + set updateMask($5.FieldMask value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasUpdateMask() => $_has(1); @$pb.TagNumber(2) void clearUpdateMask() => $_clearField(2); @$pb.TagNumber(2) - $6.FieldMask ensureUpdateMask() => $_ensure(1); + $5.FieldMask ensureUpdateMask() => $_ensure(1); } /// Request for the `ListSubscriptions` method. @@ -7284,25 +6630,21 @@ class ListSubscriptionsRequest extends $pb.GeneratedMessage { $core.int? pageSize, $core.String? pageToken, }) { - final $result = create(); - if (project != null) { - $result.project = project; - } - if (pageSize != null) { - $result.pageSize = pageSize; - } - if (pageToken != null) { - $result.pageToken = pageToken; - } - return $result; + final result = create(); + if (project != null) result.project = project; + if (pageSize != null) result.pageSize = pageSize; + if (pageToken != null) result.pageToken = pageToken; + return result; } - ListSubscriptionsRequest._() : super(); - factory ListSubscriptionsRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListSubscriptionsRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListSubscriptionsRequest._(); + + factory ListSubscriptionsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListSubscriptionsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListSubscriptionsRequest', @@ -7323,10 +6665,12 @@ class ListSubscriptionsRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListSubscriptionsRequest)) as ListSubscriptionsRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListSubscriptionsRequest create() => ListSubscriptionsRequest._(); + @$core.override ListSubscriptionsRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7340,10 +6684,7 @@ class ListSubscriptionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get project => $_getSZ(0); @$pb.TagNumber(1) - set project($core.String v) { - $_setString(0, v); - } - + set project($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasProject() => $_has(0); @$pb.TagNumber(1) @@ -7353,10 +6694,7 @@ class ListSubscriptionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.int get pageSize => $_getIZ(1); @$pb.TagNumber(2) - set pageSize($core.int v) { - $_setSignedInt32(1, v); - } - + set pageSize($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasPageSize() => $_has(1); @$pb.TagNumber(2) @@ -7368,10 +6706,7 @@ class ListSubscriptionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get pageToken => $_getSZ(2); @$pb.TagNumber(3) - set pageToken($core.String v) { - $_setString(2, v); - } - + set pageToken($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasPageToken() => $_has(2); @$pb.TagNumber(3) @@ -7384,22 +6719,20 @@ class ListSubscriptionsResponse extends $pb.GeneratedMessage { $core.Iterable? subscriptions, $core.String? nextPageToken, }) { - final $result = create(); - if (subscriptions != null) { - $result.subscriptions.addAll(subscriptions); - } - if (nextPageToken != null) { - $result.nextPageToken = nextPageToken; - } - return $result; + final result = create(); + if (subscriptions != null) result.subscriptions.addAll(subscriptions); + if (nextPageToken != null) result.nextPageToken = nextPageToken; + return result; } - ListSubscriptionsResponse._() : super(); - factory ListSubscriptionsResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListSubscriptionsResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListSubscriptionsResponse._(); + + factory ListSubscriptionsResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListSubscriptionsResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListSubscriptionsResponse', @@ -7421,10 +6754,12 @@ class ListSubscriptionsResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListSubscriptionsResponse)) as ListSubscriptionsResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListSubscriptionsResponse create() => ListSubscriptionsResponse._(); + @$core.override ListSubscriptionsResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7443,10 +6778,7 @@ class ListSubscriptionsResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get nextPageToken => $_getSZ(1); @$pb.TagNumber(2) - set nextPageToken($core.String v) { - $_setString(1, v); - } - + set nextPageToken($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasNextPageToken() => $_has(1); @$pb.TagNumber(2) @@ -7458,19 +6790,19 @@ class DeleteSubscriptionRequest extends $pb.GeneratedMessage { factory DeleteSubscriptionRequest({ $core.String? subscription, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + return result; } - DeleteSubscriptionRequest._() : super(); - factory DeleteSubscriptionRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DeleteSubscriptionRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + DeleteSubscriptionRequest._(); + + factory DeleteSubscriptionRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DeleteSubscriptionRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'DeleteSubscriptionRequest', @@ -7489,10 +6821,12 @@ class DeleteSubscriptionRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as DeleteSubscriptionRequest)) as DeleteSubscriptionRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DeleteSubscriptionRequest create() => DeleteSubscriptionRequest._(); + @$core.override DeleteSubscriptionRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7506,10 +6840,7 @@ class DeleteSubscriptionRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -7522,22 +6853,20 @@ class ModifyPushConfigRequest extends $pb.GeneratedMessage { $core.String? subscription, PushConfig? pushConfig, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - if (pushConfig != null) { - $result.pushConfig = pushConfig; - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + if (pushConfig != null) result.pushConfig = pushConfig; + return result; } - ModifyPushConfigRequest._() : super(); - factory ModifyPushConfigRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ModifyPushConfigRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ModifyPushConfigRequest._(); + + factory ModifyPushConfigRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ModifyPushConfigRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ModifyPushConfigRequest', @@ -7558,10 +6887,12 @@ class ModifyPushConfigRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ModifyPushConfigRequest)) as ModifyPushConfigRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ModifyPushConfigRequest create() => ModifyPushConfigRequest._(); + @$core.override ModifyPushConfigRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7575,10 +6906,7 @@ class ModifyPushConfigRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -7593,10 +6921,7 @@ class ModifyPushConfigRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) PushConfig get pushConfig => $_getN(1); @$pb.TagNumber(2) - set pushConfig(PushConfig v) { - $_setField(2, v); - } - + set pushConfig(PushConfig value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasPushConfig() => $_has(1); @$pb.TagNumber(2) @@ -7613,26 +6938,21 @@ class PullRequest extends $pb.GeneratedMessage { $core.bool? returnImmediately, $core.int? maxMessages, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - if (returnImmediately != null) { - // ignore: deprecated_member_use_from_same_package - $result.returnImmediately = returnImmediately; - } - if (maxMessages != null) { - $result.maxMessages = maxMessages; - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + if (returnImmediately != null) result.returnImmediately = returnImmediately; + if (maxMessages != null) result.maxMessages = maxMessages; + return result; } - PullRequest._() : super(); - factory PullRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PullRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PullRequest._(); + + factory PullRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PullRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PullRequest', @@ -7651,10 +6971,12 @@ class PullRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PullRequest)) as PullRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PullRequest create() => PullRequest._(); + @$core.override PullRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -7667,10 +6989,7 @@ class PullRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -7688,10 +7007,7 @@ class PullRequest extends $pb.GeneratedMessage { $core.bool get returnImmediately => $_getBF(1); @$core.Deprecated('This field is deprecated.') @$pb.TagNumber(2) - set returnImmediately($core.bool v) { - $_setBool(1, v); - } - + set returnImmediately($core.bool value) => $_setBool(1, value); @$core.Deprecated('This field is deprecated.') @$pb.TagNumber(2) $core.bool hasReturnImmediately() => $_has(1); @@ -7705,10 +7021,7 @@ class PullRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.int get maxMessages => $_getIZ(2); @$pb.TagNumber(3) - set maxMessages($core.int v) { - $_setSignedInt32(2, v); - } - + set maxMessages($core.int value) => $_setSignedInt32(2, value); @$pb.TagNumber(3) $core.bool hasMaxMessages() => $_has(2); @$pb.TagNumber(3) @@ -7720,19 +7033,20 @@ class PullResponse extends $pb.GeneratedMessage { factory PullResponse({ $core.Iterable? receivedMessages, }) { - final $result = create(); - if (receivedMessages != null) { - $result.receivedMessages.addAll(receivedMessages); - } - return $result; + final result = create(); + if (receivedMessages != null) + result.receivedMessages.addAll(receivedMessages); + return result; } - PullResponse._() : super(); - factory PullResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory PullResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + PullResponse._(); + + factory PullResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory PullResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'PullResponse', @@ -7751,10 +7065,12 @@ class PullResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as PullResponse)) as PullResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static PullResponse create() => PullResponse._(); + @$core.override PullResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7779,25 +7095,22 @@ class ModifyAckDeadlineRequest extends $pb.GeneratedMessage { $core.int? ackDeadlineSeconds, $core.Iterable<$core.String>? ackIds, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - if (ackDeadlineSeconds != null) { - $result.ackDeadlineSeconds = ackDeadlineSeconds; - } - if (ackIds != null) { - $result.ackIds.addAll(ackIds); - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + if (ackDeadlineSeconds != null) + result.ackDeadlineSeconds = ackDeadlineSeconds; + if (ackIds != null) result.ackIds.addAll(ackIds); + return result; } - ModifyAckDeadlineRequest._() : super(); - factory ModifyAckDeadlineRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ModifyAckDeadlineRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ModifyAckDeadlineRequest._(); + + factory ModifyAckDeadlineRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ModifyAckDeadlineRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ModifyAckDeadlineRequest', @@ -7819,10 +7132,12 @@ class ModifyAckDeadlineRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ModifyAckDeadlineRequest)) as ModifyAckDeadlineRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ModifyAckDeadlineRequest create() => ModifyAckDeadlineRequest._(); + @$core.override ModifyAckDeadlineRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7836,10 +7151,7 @@ class ModifyAckDeadlineRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -7857,10 +7169,7 @@ class ModifyAckDeadlineRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.int get ackDeadlineSeconds => $_getIZ(1); @$pb.TagNumber(3) - set ackDeadlineSeconds($core.int v) { - $_setSignedInt32(1, v); - } - + set ackDeadlineSeconds($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(3) $core.bool hasAckDeadlineSeconds() => $_has(1); @$pb.TagNumber(3) @@ -7877,22 +7186,20 @@ class AcknowledgeRequest extends $pb.GeneratedMessage { $core.String? subscription, $core.Iterable<$core.String>? ackIds, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - if (ackIds != null) { - $result.ackIds.addAll(ackIds); - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + if (ackIds != null) result.ackIds.addAll(ackIds); + return result; } - AcknowledgeRequest._() : super(); - factory AcknowledgeRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory AcknowledgeRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + AcknowledgeRequest._(); + + factory AcknowledgeRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory AcknowledgeRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'AcknowledgeRequest', @@ -7910,10 +7217,12 @@ class AcknowledgeRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as AcknowledgeRequest)) as AcknowledgeRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static AcknowledgeRequest create() => AcknowledgeRequest._(); + @$core.override AcknowledgeRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -7927,10 +7236,7 @@ class AcknowledgeRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -7958,43 +7264,32 @@ class StreamingPullRequest extends $pb.GeneratedMessage { $fixnum.Int64? maxOutstandingBytes, $fixnum.Int64? protocolVersion, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - if (ackIds != null) { - $result.ackIds.addAll(ackIds); - } - if (modifyDeadlineSeconds != null) { - $result.modifyDeadlineSeconds.addAll(modifyDeadlineSeconds); - } - if (modifyDeadlineAckIds != null) { - $result.modifyDeadlineAckIds.addAll(modifyDeadlineAckIds); - } - if (streamAckDeadlineSeconds != null) { - $result.streamAckDeadlineSeconds = streamAckDeadlineSeconds; - } - if (clientId != null) { - $result.clientId = clientId; - } - if (maxOutstandingMessages != null) { - $result.maxOutstandingMessages = maxOutstandingMessages; - } - if (maxOutstandingBytes != null) { - $result.maxOutstandingBytes = maxOutstandingBytes; - } - if (protocolVersion != null) { - $result.protocolVersion = protocolVersion; - } - return $result; - } - StreamingPullRequest._() : super(); - factory StreamingPullRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory StreamingPullRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + final result = create(); + if (subscription != null) result.subscription = subscription; + if (ackIds != null) result.ackIds.addAll(ackIds); + if (modifyDeadlineSeconds != null) + result.modifyDeadlineSeconds.addAll(modifyDeadlineSeconds); + if (modifyDeadlineAckIds != null) + result.modifyDeadlineAckIds.addAll(modifyDeadlineAckIds); + if (streamAckDeadlineSeconds != null) + result.streamAckDeadlineSeconds = streamAckDeadlineSeconds; + if (clientId != null) result.clientId = clientId; + if (maxOutstandingMessages != null) + result.maxOutstandingMessages = maxOutstandingMessages; + if (maxOutstandingBytes != null) + result.maxOutstandingBytes = maxOutstandingBytes; + if (protocolVersion != null) result.protocolVersion = protocolVersion; + return result; + } + + StreamingPullRequest._(); + + factory StreamingPullRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory StreamingPullRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'StreamingPullRequest', @@ -8022,10 +7317,12 @@ class StreamingPullRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as StreamingPullRequest)) as StreamingPullRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static StreamingPullRequest create() => StreamingPullRequest._(); + @$core.override StreamingPullRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -8041,10 +7338,7 @@ class StreamingPullRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -8087,10 +7381,7 @@ class StreamingPullRequest extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.int get streamAckDeadlineSeconds => $_getIZ(4); @$pb.TagNumber(5) - set streamAckDeadlineSeconds($core.int v) { - $_setSignedInt32(4, v); - } - + set streamAckDeadlineSeconds($core.int value) => $_setSignedInt32(4, value); @$pb.TagNumber(5) $core.bool hasStreamAckDeadlineSeconds() => $_has(4); @$pb.TagNumber(5) @@ -8105,10 +7396,7 @@ class StreamingPullRequest extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.String get clientId => $_getSZ(5); @$pb.TagNumber(6) - set clientId($core.String v) { - $_setString(5, v); - } - + set clientId($core.String value) => $_setString(5, value); @$pb.TagNumber(6) $core.bool hasClientId() => $_has(5); @$pb.TagNumber(6) @@ -8126,10 +7414,7 @@ class StreamingPullRequest extends $pb.GeneratedMessage { @$pb.TagNumber(7) $fixnum.Int64 get maxOutstandingMessages => $_getI64(6); @$pb.TagNumber(7) - set maxOutstandingMessages($fixnum.Int64 v) { - $_setInt64(6, v); - } - + set maxOutstandingMessages($fixnum.Int64 value) => $_setInt64(6, value); @$pb.TagNumber(7) $core.bool hasMaxOutstandingMessages() => $_has(6); @$pb.TagNumber(7) @@ -8147,10 +7432,7 @@ class StreamingPullRequest extends $pb.GeneratedMessage { @$pb.TagNumber(8) $fixnum.Int64 get maxOutstandingBytes => $_getI64(7); @$pb.TagNumber(8) - set maxOutstandingBytes($fixnum.Int64 v) { - $_setInt64(7, v); - } - + set maxOutstandingBytes($fixnum.Int64 value) => $_setInt64(7, value); @$pb.TagNumber(8) $core.bool hasMaxOutstandingBytes() => $_has(7); @$pb.TagNumber(8) @@ -8162,10 +7444,7 @@ class StreamingPullRequest extends $pb.GeneratedMessage { @$pb.TagNumber(10) $fixnum.Int64 get protocolVersion => $_getI64(8); @$pb.TagNumber(10) - set protocolVersion($fixnum.Int64 v) { - $_setInt64(8, v); - } - + set protocolVersion($fixnum.Int64 value) => $_setInt64(8, value); @$pb.TagNumber(10) $core.bool hasProtocolVersion() => $_has(8); @$pb.TagNumber(10) @@ -8182,29 +7461,25 @@ class StreamingPullResponse_AcknowledgeConfirmation $core.Iterable<$core.String>? unorderedAckIds, $core.Iterable<$core.String>? temporaryFailedAckIds, }) { - final $result = create(); - if (ackIds != null) { - $result.ackIds.addAll(ackIds); - } - if (invalidAckIds != null) { - $result.invalidAckIds.addAll(invalidAckIds); - } - if (unorderedAckIds != null) { - $result.unorderedAckIds.addAll(unorderedAckIds); - } - if (temporaryFailedAckIds != null) { - $result.temporaryFailedAckIds.addAll(temporaryFailedAckIds); - } - return $result; + final result = create(); + if (ackIds != null) result.ackIds.addAll(ackIds); + if (invalidAckIds != null) result.invalidAckIds.addAll(invalidAckIds); + if (unorderedAckIds != null) result.unorderedAckIds.addAll(unorderedAckIds); + if (temporaryFailedAckIds != null) + result.temporaryFailedAckIds.addAll(temporaryFailedAckIds); + return result; } - StreamingPullResponse_AcknowledgeConfirmation._() : super(); + + StreamingPullResponse_AcknowledgeConfirmation._(); + factory StreamingPullResponse_AcknowledgeConfirmation.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory StreamingPullResponse_AcknowledgeConfirmation.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory StreamingPullResponse_AcknowledgeConfirmation.fromJson( + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'StreamingPullResponse.AcknowledgeConfirmation', @@ -8228,11 +7503,13 @@ class StreamingPullResponse_AcknowledgeConfirmation updates(message as StreamingPullResponse_AcknowledgeConfirmation)) as StreamingPullResponse_AcknowledgeConfirmation; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static StreamingPullResponse_AcknowledgeConfirmation create() => StreamingPullResponse_AcknowledgeConfirmation._(); + @$core.override StreamingPullResponse_AcknowledgeConfirmation createEmptyInstance() => create(); static $pb.PbList @@ -8272,27 +7549,24 @@ class StreamingPullResponse_ModifyAckDeadlineConfirmation $core.Iterable<$core.String>? invalidAckIds, $core.Iterable<$core.String>? temporaryFailedAckIds, }) { - final $result = create(); - if (ackIds != null) { - $result.ackIds.addAll(ackIds); - } - if (invalidAckIds != null) { - $result.invalidAckIds.addAll(invalidAckIds); - } - if (temporaryFailedAckIds != null) { - $result.temporaryFailedAckIds.addAll(temporaryFailedAckIds); - } - return $result; + final result = create(); + if (ackIds != null) result.ackIds.addAll(ackIds); + if (invalidAckIds != null) result.invalidAckIds.addAll(invalidAckIds); + if (temporaryFailedAckIds != null) + result.temporaryFailedAckIds.addAll(temporaryFailedAckIds); + return result; } - StreamingPullResponse_ModifyAckDeadlineConfirmation._() : super(); + + StreamingPullResponse_ModifyAckDeadlineConfirmation._(); + factory StreamingPullResponse_ModifyAckDeadlineConfirmation.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); factory StreamingPullResponse_ModifyAckDeadlineConfirmation.fromJson( - $core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames @@ -8318,11 +7592,13 @@ class StreamingPullResponse_ModifyAckDeadlineConfirmation message as StreamingPullResponse_ModifyAckDeadlineConfirmation)) as StreamingPullResponse_ModifyAckDeadlineConfirmation; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static StreamingPullResponse_ModifyAckDeadlineConfirmation create() => StreamingPullResponse_ModifyAckDeadlineConfirmation._(); + @$core.override StreamingPullResponse_ModifyAckDeadlineConfirmation createEmptyInstance() => create(); static $pb.PbList @@ -8356,23 +7632,24 @@ class StreamingPullResponse_SubscriptionProperties $core.bool? exactlyOnceDeliveryEnabled, $core.bool? messageOrderingEnabled, }) { - final $result = create(); - if (exactlyOnceDeliveryEnabled != null) { - $result.exactlyOnceDeliveryEnabled = exactlyOnceDeliveryEnabled; - } - if (messageOrderingEnabled != null) { - $result.messageOrderingEnabled = messageOrderingEnabled; - } - return $result; + final result = create(); + if (exactlyOnceDeliveryEnabled != null) + result.exactlyOnceDeliveryEnabled = exactlyOnceDeliveryEnabled; + if (messageOrderingEnabled != null) + result.messageOrderingEnabled = messageOrderingEnabled; + return result; } - StreamingPullResponse_SubscriptionProperties._() : super(); + + StreamingPullResponse_SubscriptionProperties._(); + factory StreamingPullResponse_SubscriptionProperties.fromBuffer( - $core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory StreamingPullResponse_SubscriptionProperties.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory StreamingPullResponse_SubscriptionProperties.fromJson( + $core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'StreamingPullResponse.SubscriptionProperties', @@ -8394,11 +7671,13 @@ class StreamingPullResponse_SubscriptionProperties updates(message as StreamingPullResponse_SubscriptionProperties)) as StreamingPullResponse_SubscriptionProperties; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static StreamingPullResponse_SubscriptionProperties create() => StreamingPullResponse_SubscriptionProperties._(); + @$core.override StreamingPullResponse_SubscriptionProperties createEmptyInstance() => create(); static $pb.PbList @@ -8415,10 +7694,7 @@ class StreamingPullResponse_SubscriptionProperties @$pb.TagNumber(1) $core.bool get exactlyOnceDeliveryEnabled => $_getBF(0); @$pb.TagNumber(1) - set exactlyOnceDeliveryEnabled($core.bool v) { - $_setBool(0, v); - } - + set exactlyOnceDeliveryEnabled($core.bool value) => $_setBool(0, value); @$pb.TagNumber(1) $core.bool hasExactlyOnceDeliveryEnabled() => $_has(0); @$pb.TagNumber(1) @@ -8428,10 +7704,7 @@ class StreamingPullResponse_SubscriptionProperties @$pb.TagNumber(2) $core.bool get messageOrderingEnabled => $_getBF(1); @$pb.TagNumber(2) - set messageOrderingEnabled($core.bool v) { - $_setBool(1, v); - } - + set messageOrderingEnabled($core.bool value) => $_setBool(1, value); @$pb.TagNumber(2) $core.bool hasMessageOrderingEnabled() => $_has(1); @$pb.TagNumber(2) @@ -8448,28 +7721,26 @@ class StreamingPullResponse extends $pb.GeneratedMessage { StreamingPullResponse_SubscriptionProperties? subscriptionProperties, StreamingPullResponse_AcknowledgeConfirmation? acknowledgeConfirmation, }) { - final $result = create(); - if (receivedMessages != null) { - $result.receivedMessages.addAll(receivedMessages); - } - if (modifyAckDeadlineConfirmation != null) { - $result.modifyAckDeadlineConfirmation = modifyAckDeadlineConfirmation; - } - if (subscriptionProperties != null) { - $result.subscriptionProperties = subscriptionProperties; - } - if (acknowledgeConfirmation != null) { - $result.acknowledgeConfirmation = acknowledgeConfirmation; - } - return $result; - } - StreamingPullResponse._() : super(); - factory StreamingPullResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory StreamingPullResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + final result = create(); + if (receivedMessages != null) + result.receivedMessages.addAll(receivedMessages); + if (modifyAckDeadlineConfirmation != null) + result.modifyAckDeadlineConfirmation = modifyAckDeadlineConfirmation; + if (subscriptionProperties != null) + result.subscriptionProperties = subscriptionProperties; + if (acknowledgeConfirmation != null) + result.acknowledgeConfirmation = acknowledgeConfirmation; + return result; + } + + StreamingPullResponse._(); + + factory StreamingPullResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory StreamingPullResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'StreamingPullResponse', @@ -8499,10 +7770,12 @@ class StreamingPullResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as StreamingPullResponse)) as StreamingPullResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static StreamingPullResponse create() => StreamingPullResponse._(); + @$core.override StreamingPullResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -8522,10 +7795,8 @@ class StreamingPullResponse extends $pb.GeneratedMessage { get modifyAckDeadlineConfirmation => $_getN(1); @$pb.TagNumber(3) set modifyAckDeadlineConfirmation( - StreamingPullResponse_ModifyAckDeadlineConfirmation v) { - $_setField(3, v); - } - + StreamingPullResponse_ModifyAckDeadlineConfirmation value) => + $_setField(3, value); @$pb.TagNumber(3) $core.bool hasModifyAckDeadlineConfirmation() => $_has(1); @$pb.TagNumber(3) @@ -8539,10 +7810,9 @@ class StreamingPullResponse extends $pb.GeneratedMessage { StreamingPullResponse_SubscriptionProperties get subscriptionProperties => $_getN(2); @$pb.TagNumber(4) - set subscriptionProperties(StreamingPullResponse_SubscriptionProperties v) { - $_setField(4, v); - } - + set subscriptionProperties( + StreamingPullResponse_SubscriptionProperties value) => + $_setField(4, value); @$pb.TagNumber(4) $core.bool hasSubscriptionProperties() => $_has(2); @$pb.TagNumber(4) @@ -8557,10 +7827,9 @@ class StreamingPullResponse extends $pb.GeneratedMessage { StreamingPullResponse_AcknowledgeConfirmation get acknowledgeConfirmation => $_getN(3); @$pb.TagNumber(5) - set acknowledgeConfirmation(StreamingPullResponse_AcknowledgeConfirmation v) { - $_setField(5, v); - } - + set acknowledgeConfirmation( + StreamingPullResponse_AcknowledgeConfirmation value) => + $_setField(5, value); @$pb.TagNumber(5) $core.bool hasAcknowledgeConfirmation() => $_has(3); @$pb.TagNumber(5) @@ -8578,28 +7847,22 @@ class CreateSnapshotRequest extends $pb.GeneratedMessage { $core.Iterable<$core.MapEntry<$core.String, $core.String>>? labels, $core.Iterable<$core.MapEntry<$core.String, $core.String>>? tags, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (subscription != null) { - $result.subscription = subscription; - } - if (labels != null) { - $result.labels.addEntries(labels); - } - if (tags != null) { - $result.tags.addEntries(tags); - } - return $result; + final result = create(); + if (name != null) result.name = name; + if (subscription != null) result.subscription = subscription; + if (labels != null) result.labels.addEntries(labels); + if (tags != null) result.tags.addEntries(tags); + return result; } - CreateSnapshotRequest._() : super(); - factory CreateSnapshotRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory CreateSnapshotRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + CreateSnapshotRequest._(); + + factory CreateSnapshotRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CreateSnapshotRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'CreateSnapshotRequest', @@ -8629,10 +7892,12 @@ class CreateSnapshotRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as CreateSnapshotRequest)) as CreateSnapshotRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static CreateSnapshotRequest create() => CreateSnapshotRequest._(); + @$core.override CreateSnapshotRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -8650,10 +7915,7 @@ class CreateSnapshotRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -8671,10 +7933,7 @@ class CreateSnapshotRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get subscription => $_getSZ(1); @$pb.TagNumber(2) - set subscription($core.String v) { - $_setString(1, v); - } - + set subscription($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasSubscription() => $_has(1); @$pb.TagNumber(2) @@ -8699,24 +7958,22 @@ class CreateSnapshotRequest extends $pb.GeneratedMessage { class UpdateSnapshotRequest extends $pb.GeneratedMessage { factory UpdateSnapshotRequest({ Snapshot? snapshot, - $6.FieldMask? updateMask, + $5.FieldMask? updateMask, }) { - final $result = create(); - if (snapshot != null) { - $result.snapshot = snapshot; - } - if (updateMask != null) { - $result.updateMask = updateMask; - } - return $result; + final result = create(); + if (snapshot != null) result.snapshot = snapshot; + if (updateMask != null) result.updateMask = updateMask; + return result; } - UpdateSnapshotRequest._() : super(); - factory UpdateSnapshotRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory UpdateSnapshotRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + UpdateSnapshotRequest._(); + + factory UpdateSnapshotRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory UpdateSnapshotRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'UpdateSnapshotRequest', @@ -8725,8 +7982,8 @@ class UpdateSnapshotRequest extends $pb.GeneratedMessage { createEmptyInstance: create) ..aOM(1, _omitFieldNames ? '' : 'snapshot', subBuilder: Snapshot.create) - ..aOM<$6.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', - subBuilder: $6.FieldMask.create) + ..aOM<$5.FieldMask>(2, _omitFieldNames ? '' : 'updateMask', + subBuilder: $5.FieldMask.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -8738,10 +7995,12 @@ class UpdateSnapshotRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as UpdateSnapshotRequest)) as UpdateSnapshotRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UpdateSnapshotRequest create() => UpdateSnapshotRequest._(); + @$core.override UpdateSnapshotRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -8754,10 +8013,7 @@ class UpdateSnapshotRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) Snapshot get snapshot => $_getN(0); @$pb.TagNumber(1) - set snapshot(Snapshot v) { - $_setField(1, v); - } - + set snapshot(Snapshot value) => $_setField(1, value); @$pb.TagNumber(1) $core.bool hasSnapshot() => $_has(0); @$pb.TagNumber(1) @@ -8768,18 +8024,15 @@ class UpdateSnapshotRequest extends $pb.GeneratedMessage { /// Required. Indicates which fields in the provided snapshot to update. /// Must be specified and non-empty. @$pb.TagNumber(2) - $6.FieldMask get updateMask => $_getN(1); + $5.FieldMask get updateMask => $_getN(1); @$pb.TagNumber(2) - set updateMask($6.FieldMask v) { - $_setField(2, v); - } - + set updateMask($5.FieldMask value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasUpdateMask() => $_has(1); @$pb.TagNumber(2) void clearUpdateMask() => $_clearField(2); @$pb.TagNumber(2) - $6.FieldMask ensureUpdateMask() => $_ensure(1); + $5.FieldMask ensureUpdateMask() => $_ensure(1); } /// A snapshot resource. Snapshots are used in @@ -8791,31 +8044,25 @@ class Snapshot extends $pb.GeneratedMessage { factory Snapshot({ $core.String? name, $core.String? topic, - $3.Timestamp? expireTime, + $2.Timestamp? expireTime, $core.Iterable<$core.MapEntry<$core.String, $core.String>>? labels, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (topic != null) { - $result.topic = topic; - } - if (expireTime != null) { - $result.expireTime = expireTime; - } - if (labels != null) { - $result.labels.addEntries(labels); - } - return $result; + final result = create(); + if (name != null) result.name = name; + if (topic != null) result.topic = topic; + if (expireTime != null) result.expireTime = expireTime; + if (labels != null) result.labels.addEntries(labels); + return result; } - Snapshot._() : super(); - factory Snapshot.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Snapshot.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + Snapshot._(); + + factory Snapshot.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Snapshot.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Snapshot', @@ -8824,8 +8071,8 @@ class Snapshot extends $pb.GeneratedMessage { createEmptyInstance: create) ..aOS(1, _omitFieldNames ? '' : 'name') ..aOS(2, _omitFieldNames ? '' : 'topic') - ..aOM<$3.Timestamp>(3, _omitFieldNames ? '' : 'expireTime', - subBuilder: $3.Timestamp.create) + ..aOM<$2.Timestamp>(3, _omitFieldNames ? '' : 'expireTime', + subBuilder: $2.Timestamp.create) ..m<$core.String, $core.String>(4, _omitFieldNames ? '' : 'labels', entryClassName: 'Snapshot.LabelsEntry', keyFieldType: $pb.PbFieldType.OS, @@ -8839,10 +8086,12 @@ class Snapshot extends $pb.GeneratedMessage { Snapshot copyWith(void Function(Snapshot) updates) => super.copyWith((message) => updates(message as Snapshot)) as Snapshot; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Snapshot create() => Snapshot._(); + @$core.override Snapshot createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -8854,10 +8103,7 @@ class Snapshot extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -8868,10 +8114,7 @@ class Snapshot extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get topic => $_getSZ(1); @$pb.TagNumber(2) - set topic($core.String v) { - $_setString(1, v); - } - + set topic($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasTopic() => $_has(1); @$pb.TagNumber(2) @@ -8888,18 +8131,15 @@ class Snapshot extends $pb.GeneratedMessage { /// exists -- will expire in 4 days. The service will refuse to create a /// snapshot that would expire in less than 1 hour after creation. @$pb.TagNumber(3) - $3.Timestamp get expireTime => $_getN(2); + $2.Timestamp get expireTime => $_getN(2); @$pb.TagNumber(3) - set expireTime($3.Timestamp v) { - $_setField(3, v); - } - + set expireTime($2.Timestamp value) => $_setField(3, value); @$pb.TagNumber(3) $core.bool hasExpireTime() => $_has(2); @$pb.TagNumber(3) void clearExpireTime() => $_clearField(3); @$pb.TagNumber(3) - $3.Timestamp ensureExpireTime() => $_ensure(2); + $2.Timestamp ensureExpireTime() => $_ensure(2); /// Optional. See [Creating and managing labels] /// (https://cloud.google.com/pubsub/docs/labels). @@ -8912,19 +8152,19 @@ class GetSnapshotRequest extends $pb.GeneratedMessage { factory GetSnapshotRequest({ $core.String? snapshot, }) { - final $result = create(); - if (snapshot != null) { - $result.snapshot = snapshot; - } - return $result; + final result = create(); + if (snapshot != null) result.snapshot = snapshot; + return result; } - GetSnapshotRequest._() : super(); - factory GetSnapshotRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory GetSnapshotRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + GetSnapshotRequest._(); + + factory GetSnapshotRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory GetSnapshotRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'GetSnapshotRequest', @@ -8941,10 +8181,12 @@ class GetSnapshotRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as GetSnapshotRequest)) as GetSnapshotRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static GetSnapshotRequest create() => GetSnapshotRequest._(); + @$core.override GetSnapshotRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -8958,10 +8200,7 @@ class GetSnapshotRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get snapshot => $_getSZ(0); @$pb.TagNumber(1) - set snapshot($core.String v) { - $_setString(0, v); - } - + set snapshot($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSnapshot() => $_has(0); @$pb.TagNumber(1) @@ -8975,25 +8214,21 @@ class ListSnapshotsRequest extends $pb.GeneratedMessage { $core.int? pageSize, $core.String? pageToken, }) { - final $result = create(); - if (project != null) { - $result.project = project; - } - if (pageSize != null) { - $result.pageSize = pageSize; - } - if (pageToken != null) { - $result.pageToken = pageToken; - } - return $result; + final result = create(); + if (project != null) result.project = project; + if (pageSize != null) result.pageSize = pageSize; + if (pageToken != null) result.pageToken = pageToken; + return result; } - ListSnapshotsRequest._() : super(); - factory ListSnapshotsRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListSnapshotsRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListSnapshotsRequest._(); + + factory ListSnapshotsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListSnapshotsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListSnapshotsRequest', @@ -9013,10 +8248,12 @@ class ListSnapshotsRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListSnapshotsRequest)) as ListSnapshotsRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListSnapshotsRequest create() => ListSnapshotsRequest._(); + @$core.override ListSnapshotsRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -9030,10 +8267,7 @@ class ListSnapshotsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get project => $_getSZ(0); @$pb.TagNumber(1) - set project($core.String v) { - $_setString(0, v); - } - + set project($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasProject() => $_has(0); @$pb.TagNumber(1) @@ -9043,10 +8277,7 @@ class ListSnapshotsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.int get pageSize => $_getIZ(1); @$pb.TagNumber(2) - set pageSize($core.int v) { - $_setSignedInt32(1, v); - } - + set pageSize($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasPageSize() => $_has(1); @$pb.TagNumber(2) @@ -9058,10 +8289,7 @@ class ListSnapshotsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get pageToken => $_getSZ(2); @$pb.TagNumber(3) - set pageToken($core.String v) { - $_setString(2, v); - } - + set pageToken($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasPageToken() => $_has(2); @$pb.TagNumber(3) @@ -9074,22 +8302,20 @@ class ListSnapshotsResponse extends $pb.GeneratedMessage { $core.Iterable? snapshots, $core.String? nextPageToken, }) { - final $result = create(); - if (snapshots != null) { - $result.snapshots.addAll(snapshots); - } - if (nextPageToken != null) { - $result.nextPageToken = nextPageToken; - } - return $result; + final result = create(); + if (snapshots != null) result.snapshots.addAll(snapshots); + if (nextPageToken != null) result.nextPageToken = nextPageToken; + return result; } - ListSnapshotsResponse._() : super(); - factory ListSnapshotsResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListSnapshotsResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListSnapshotsResponse._(); + + factory ListSnapshotsResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListSnapshotsResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListSnapshotsResponse', @@ -9110,10 +8336,12 @@ class ListSnapshotsResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListSnapshotsResponse)) as ListSnapshotsResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListSnapshotsResponse create() => ListSnapshotsResponse._(); + @$core.override ListSnapshotsResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -9132,10 +8360,7 @@ class ListSnapshotsResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get nextPageToken => $_getSZ(1); @$pb.TagNumber(2) - set nextPageToken($core.String v) { - $_setString(1, v); - } - + set nextPageToken($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasNextPageToken() => $_has(1); @$pb.TagNumber(2) @@ -9147,19 +8372,19 @@ class DeleteSnapshotRequest extends $pb.GeneratedMessage { factory DeleteSnapshotRequest({ $core.String? snapshot, }) { - final $result = create(); - if (snapshot != null) { - $result.snapshot = snapshot; - } - return $result; + final result = create(); + if (snapshot != null) result.snapshot = snapshot; + return result; } - DeleteSnapshotRequest._() : super(); - factory DeleteSnapshotRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DeleteSnapshotRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + DeleteSnapshotRequest._(); + + factory DeleteSnapshotRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DeleteSnapshotRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'DeleteSnapshotRequest', @@ -9178,10 +8403,12 @@ class DeleteSnapshotRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as DeleteSnapshotRequest)) as DeleteSnapshotRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DeleteSnapshotRequest create() => DeleteSnapshotRequest._(); + @$core.override DeleteSnapshotRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -9195,10 +8422,7 @@ class DeleteSnapshotRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get snapshot => $_getSZ(0); @$pb.TagNumber(1) - set snapshot($core.String v) { - $_setString(0, v); - } - + set snapshot($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSnapshot() => $_has(0); @$pb.TagNumber(1) @@ -9211,28 +8435,24 @@ enum SeekRequest_Target { time, snapshot, notSet } class SeekRequest extends $pb.GeneratedMessage { factory SeekRequest({ $core.String? subscription, - $3.Timestamp? time, + $2.Timestamp? time, $core.String? snapshot, }) { - final $result = create(); - if (subscription != null) { - $result.subscription = subscription; - } - if (time != null) { - $result.time = time; - } - if (snapshot != null) { - $result.snapshot = snapshot; - } - return $result; + final result = create(); + if (subscription != null) result.subscription = subscription; + if (time != null) result.time = time; + if (snapshot != null) result.snapshot = snapshot; + return result; } - SeekRequest._() : super(); - factory SeekRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory SeekRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + SeekRequest._(); + + factory SeekRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SeekRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, SeekRequest_Target> _SeekRequest_TargetByTag = { @@ -9247,8 +8467,8 @@ class SeekRequest extends $pb.GeneratedMessage { createEmptyInstance: create) ..oo(0, [2, 3]) ..aOS(1, _omitFieldNames ? '' : 'subscription') - ..aOM<$3.Timestamp>(2, _omitFieldNames ? '' : 'time', - subBuilder: $3.Timestamp.create) + ..aOM<$2.Timestamp>(2, _omitFieldNames ? '' : 'time', + subBuilder: $2.Timestamp.create) ..aOS(3, _omitFieldNames ? '' : 'snapshot') ..hasRequiredFields = false; @@ -9259,10 +8479,12 @@ class SeekRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as SeekRequest)) as SeekRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SeekRequest create() => SeekRequest._(); + @$core.override SeekRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -9278,10 +8500,7 @@ class SeekRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get subscription => $_getSZ(0); @$pb.TagNumber(1) - set subscription($core.String v) { - $_setString(0, v); - } - + set subscription($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasSubscription() => $_has(0); @$pb.TagNumber(1) @@ -9299,18 +8518,15 @@ class SeekRequest extends $pb.GeneratedMessage { /// creation time), only retained messages will be marked as unacknowledged, /// and already-expunged messages will not be restored. @$pb.TagNumber(2) - $3.Timestamp get time => $_getN(1); + $2.Timestamp get time => $_getN(1); @$pb.TagNumber(2) - set time($3.Timestamp v) { - $_setField(2, v); - } - + set time($2.Timestamp value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasTime() => $_has(1); @$pb.TagNumber(2) void clearTime() => $_clearField(2); @$pb.TagNumber(2) - $3.Timestamp ensureTime() => $_ensure(1); + $2.Timestamp ensureTime() => $_ensure(1); /// Optional. The snapshot to seek to. The snapshot's topic must be the same /// as that of the provided subscription. Format is @@ -9318,10 +8534,7 @@ class SeekRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get snapshot => $_getSZ(2); @$pb.TagNumber(3) - set snapshot($core.String v) { - $_setString(2, v); - } - + set snapshot($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasSnapshot() => $_has(2); @$pb.TagNumber(3) @@ -9331,13 +8544,15 @@ class SeekRequest extends $pb.GeneratedMessage { /// Response for the `Seek` method (this response is empty). class SeekResponse extends $pb.GeneratedMessage { factory SeekResponse() => create(); - SeekResponse._() : super(); - factory SeekResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory SeekResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + SeekResponse._(); + + factory SeekResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SeekResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'SeekResponse', @@ -9353,10 +8568,12 @@ class SeekResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as SeekResponse)) as SeekResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SeekResponse create() => SeekResponse._(); + @$core.override SeekResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -9366,6 +8583,7 @@ class SeekResponse extends $pb.GeneratedMessage { static SeekResponse? _defaultInstance; } -const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbenum.dart index 12cba020..27d86a6e 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbenum.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbenum.dart @@ -1,13 +1,14 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/pubsub/v1/pubsub.proto -// +// Generated from google/pubsub/v1/pubsub.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; @@ -73,7 +74,7 @@ class IngestionDataSourceSettings_AwsKinesis_State extends $pb.ProtobufEnum { $core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const IngestionDataSourceSettings_AwsKinesis_State._(super.v, super.n); + const IngestionDataSourceSettings_AwsKinesis_State._(super.value, super.name); } /// Possible states for ingestion from Cloud Storage. @@ -135,7 +136,8 @@ class IngestionDataSourceSettings_CloudStorage_State extends $pb.ProtobufEnum { $core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const IngestionDataSourceSettings_CloudStorage_State._(super.v, super.n); + const IngestionDataSourceSettings_CloudStorage_State._( + super.value, super.name); } /// Possible states for managed ingestion from Event Hubs. @@ -205,7 +207,8 @@ class IngestionDataSourceSettings_AzureEventHubs_State $core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const IngestionDataSourceSettings_AzureEventHubs_State._(super.v, super.n); + const IngestionDataSourceSettings_AzureEventHubs_State._( + super.value, super.name); } /// Possible states for managed ingestion from Amazon MSK. @@ -255,7 +258,7 @@ class IngestionDataSourceSettings_AwsMsk_State extends $pb.ProtobufEnum { static IngestionDataSourceSettings_AwsMsk_State? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const IngestionDataSourceSettings_AwsMsk_State._(super.v, super.n); + const IngestionDataSourceSettings_AwsMsk_State._(super.value, super.name); } /// Possible states for managed ingestion from Confluent Cloud. @@ -317,7 +320,8 @@ class IngestionDataSourceSettings_ConfluentCloud_State $core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const IngestionDataSourceSettings_ConfluentCloud_State._(super.v, super.n); + const IngestionDataSourceSettings_ConfluentCloud_State._( + super.value, super.name); } /// Severity levels of Platform Logs. @@ -362,7 +366,7 @@ class PlatformLogsSettings_Severity extends $pb.ProtobufEnum { static PlatformLogsSettings_Severity? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const PlatformLogsSettings_Severity._(super.v, super.n); + const PlatformLogsSettings_Severity._(super.value, super.name); } /// The state of the topic. @@ -392,7 +396,7 @@ class Topic_State extends $pb.ProtobufEnum { static Topic_State? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const Topic_State._(super.v, super.n); + const Topic_State._(super.value, super.name); } /// Possible states for a subscription. @@ -422,7 +426,7 @@ class Subscription_State extends $pb.ProtobufEnum { static Subscription_State? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const Subscription_State._(super.v, super.n); + const Subscription_State._(super.value, super.name); } /// Possible states for a BigQuery subscription. @@ -480,7 +484,7 @@ class BigQueryConfig_State extends $pb.ProtobufEnum { static BigQueryConfig_State? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const BigQueryConfig_State._(super.v, super.n); + const BigQueryConfig_State._(super.value, super.name); } /// Possible states for a Bigtable subscription. @@ -548,7 +552,7 @@ class BigtableConfig_State extends $pb.ProtobufEnum { static BigtableConfig_State? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const BigtableConfig_State._(super.v, super.n); + const BigtableConfig_State._(super.value, super.name); } /// Possible states for a Cloud Storage subscription. @@ -604,7 +608,8 @@ class CloudStorageConfig_State extends $pb.ProtobufEnum { static CloudStorageConfig_State? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const CloudStorageConfig_State._(super.v, super.n); + const CloudStorageConfig_State._(super.value, super.name); } -const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names'); +const $core.bool _omitEnumNames = + $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart index f7c2b106..90b951c8 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart @@ -1,13 +1,14 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/pubsub/v1/pubsub.proto -// +// Generated from google/pubsub/v1/pubsub.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:async' as $async; import 'dart:core' as $core; @@ -33,95 +34,57 @@ class PublisherClient extends $grpc.Client { 'https://www.googleapis.com/auth/pubsub', ]; - static final _$createTopic = $grpc.ClientMethod<$0.Topic, $0.Topic>( - '/google.pubsub.v1.Publisher/CreateTopic', - ($0.Topic value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Topic.fromBuffer(value)); - static final _$updateTopic = - $grpc.ClientMethod<$0.UpdateTopicRequest, $0.Topic>( - '/google.pubsub.v1.Publisher/UpdateTopic', - ($0.UpdateTopicRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Topic.fromBuffer(value)); - static final _$publish = - $grpc.ClientMethod<$0.PublishRequest, $0.PublishResponse>( - '/google.pubsub.v1.Publisher/Publish', - ($0.PublishRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $0.PublishResponse.fromBuffer(value)); - static final _$getTopic = $grpc.ClientMethod<$0.GetTopicRequest, $0.Topic>( - '/google.pubsub.v1.Publisher/GetTopic', - ($0.GetTopicRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Topic.fromBuffer(value)); - static final _$listTopics = - $grpc.ClientMethod<$0.ListTopicsRequest, $0.ListTopicsResponse>( - '/google.pubsub.v1.Publisher/ListTopics', - ($0.ListTopicsRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $0.ListTopicsResponse.fromBuffer(value)); - static final _$listTopicSubscriptions = $grpc.ClientMethod< - $0.ListTopicSubscriptionsRequest, $0.ListTopicSubscriptionsResponse>( - '/google.pubsub.v1.Publisher/ListTopicSubscriptions', - ($0.ListTopicSubscriptionsRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $0.ListTopicSubscriptionsResponse.fromBuffer(value)); - static final _$listTopicSnapshots = $grpc.ClientMethod< - $0.ListTopicSnapshotsRequest, $0.ListTopicSnapshotsResponse>( - '/google.pubsub.v1.Publisher/ListTopicSnapshots', - ($0.ListTopicSnapshotsRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $0.ListTopicSnapshotsResponse.fromBuffer(value)); - static final _$deleteTopic = - $grpc.ClientMethod<$0.DeleteTopicRequest, $1.Empty>( - '/google.pubsub.v1.Publisher/DeleteTopic', - ($0.DeleteTopicRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); - static final _$detachSubscription = $grpc.ClientMethod< - $0.DetachSubscriptionRequest, $0.DetachSubscriptionResponse>( - '/google.pubsub.v1.Publisher/DetachSubscription', - ($0.DetachSubscriptionRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $0.DetachSubscriptionResponse.fromBuffer(value)); - PublisherClient(super.channel, {super.options, super.interceptors}); /// Creates the given topic with the given name. See the [resource name rules] /// (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). - $grpc.ResponseFuture<$0.Topic> createTopic($0.Topic request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Topic> createTopic( + $0.Topic request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$createTopic, request, options: options); } /// Updates an existing topic by updating the fields specified in the update /// mask. Note that certain properties of a topic are not modifiable. - $grpc.ResponseFuture<$0.Topic> updateTopic($0.UpdateTopicRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Topic> updateTopic( + $0.UpdateTopicRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$updateTopic, request, options: options); } /// Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic /// does not exist. - $grpc.ResponseFuture<$0.PublishResponse> publish($0.PublishRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.PublishResponse> publish( + $0.PublishRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$publish, request, options: options); } /// Gets the configuration of a topic. - $grpc.ResponseFuture<$0.Topic> getTopic($0.GetTopicRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Topic> getTopic( + $0.GetTopicRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$getTopic, request, options: options); } /// Lists matching topics. $grpc.ResponseFuture<$0.ListTopicsResponse> listTopics( - $0.ListTopicsRequest request, - {$grpc.CallOptions? options}) { + $0.ListTopicsRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$listTopics, request, options: options); } /// Lists the names of the attached subscriptions on this topic. $grpc.ResponseFuture<$0.ListTopicSubscriptionsResponse> - listTopicSubscriptions($0.ListTopicSubscriptionsRequest request, - {$grpc.CallOptions? options}) { + listTopicSubscriptions( + $0.ListTopicSubscriptionsRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$listTopicSubscriptions, request, options: options); } @@ -132,8 +95,9 @@ class PublisherClient extends $grpc.Client { /// set the acknowledgment state of messages in an existing subscription to the /// state captured by a snapshot. $grpc.ResponseFuture<$0.ListTopicSnapshotsResponse> listTopicSnapshots( - $0.ListTopicSnapshotsRequest request, - {$grpc.CallOptions? options}) { + $0.ListTopicSnapshotsRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$listTopicSnapshots, request, options: options); } @@ -142,8 +106,10 @@ class PublisherClient extends $grpc.Client { /// the same name; this is an entirely new topic with none of the old /// configuration or subscriptions. Existing subscriptions to this topic are /// not deleted, but their `topic` field is set to `_deleted-topic_`. - $grpc.ResponseFuture<$1.Empty> deleteTopic($0.DeleteTopicRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$1.Empty> deleteTopic( + $0.DeleteTopicRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$deleteTopic, request, options: options); } @@ -152,10 +118,57 @@ class PublisherClient extends $grpc.Client { /// will return FAILED_PRECONDITION. If the subscription is a push /// subscription, pushes to the endpoint will stop. $grpc.ResponseFuture<$0.DetachSubscriptionResponse> detachSubscription( - $0.DetachSubscriptionRequest request, - {$grpc.CallOptions? options}) { + $0.DetachSubscriptionRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$detachSubscription, request, options: options); } + + // method descriptors + + static final _$createTopic = $grpc.ClientMethod<$0.Topic, $0.Topic>( + '/google.pubsub.v1.Publisher/CreateTopic', + ($0.Topic value) => value.writeToBuffer(), + $0.Topic.fromBuffer); + static final _$updateTopic = + $grpc.ClientMethod<$0.UpdateTopicRequest, $0.Topic>( + '/google.pubsub.v1.Publisher/UpdateTopic', + ($0.UpdateTopicRequest value) => value.writeToBuffer(), + $0.Topic.fromBuffer); + static final _$publish = + $grpc.ClientMethod<$0.PublishRequest, $0.PublishResponse>( + '/google.pubsub.v1.Publisher/Publish', + ($0.PublishRequest value) => value.writeToBuffer(), + $0.PublishResponse.fromBuffer); + static final _$getTopic = $grpc.ClientMethod<$0.GetTopicRequest, $0.Topic>( + '/google.pubsub.v1.Publisher/GetTopic', + ($0.GetTopicRequest value) => value.writeToBuffer(), + $0.Topic.fromBuffer); + static final _$listTopics = + $grpc.ClientMethod<$0.ListTopicsRequest, $0.ListTopicsResponse>( + '/google.pubsub.v1.Publisher/ListTopics', + ($0.ListTopicsRequest value) => value.writeToBuffer(), + $0.ListTopicsResponse.fromBuffer); + static final _$listTopicSubscriptions = $grpc.ClientMethod< + $0.ListTopicSubscriptionsRequest, $0.ListTopicSubscriptionsResponse>( + '/google.pubsub.v1.Publisher/ListTopicSubscriptions', + ($0.ListTopicSubscriptionsRequest value) => value.writeToBuffer(), + $0.ListTopicSubscriptionsResponse.fromBuffer); + static final _$listTopicSnapshots = $grpc.ClientMethod< + $0.ListTopicSnapshotsRequest, $0.ListTopicSnapshotsResponse>( + '/google.pubsub.v1.Publisher/ListTopicSnapshots', + ($0.ListTopicSnapshotsRequest value) => value.writeToBuffer(), + $0.ListTopicSnapshotsResponse.fromBuffer); + static final _$deleteTopic = + $grpc.ClientMethod<$0.DeleteTopicRequest, $1.Empty>( + '/google.pubsub.v1.Publisher/DeleteTopic', + ($0.DeleteTopicRequest value) => value.writeToBuffer(), + $1.Empty.fromBuffer); + static final _$detachSubscription = $grpc.ClientMethod< + $0.DetachSubscriptionRequest, $0.DetachSubscriptionResponse>( + '/google.pubsub.v1.Publisher/DetachSubscription', + ($0.DetachSubscriptionRequest value) => value.writeToBuffer(), + $0.DetachSubscriptionResponse.fromBuffer); } @$pb.GrpcServiceName('google.pubsub.v1.Publisher') @@ -241,64 +254,72 @@ abstract class PublisherServiceBase extends $grpc.Service { return createTopic($call, await $request); } + $async.Future<$0.Topic> createTopic($grpc.ServiceCall call, $0.Topic request); + $async.Future<$0.Topic> updateTopic_Pre($grpc.ServiceCall $call, $async.Future<$0.UpdateTopicRequest> $request) async { return updateTopic($call, await $request); } + $async.Future<$0.Topic> updateTopic( + $grpc.ServiceCall call, $0.UpdateTopicRequest request); + $async.Future<$0.PublishResponse> publish_Pre($grpc.ServiceCall $call, $async.Future<$0.PublishRequest> $request) async { return publish($call, await $request); } + $async.Future<$0.PublishResponse> publish( + $grpc.ServiceCall call, $0.PublishRequest request); + $async.Future<$0.Topic> getTopic_Pre($grpc.ServiceCall $call, $async.Future<$0.GetTopicRequest> $request) async { return getTopic($call, await $request); } + $async.Future<$0.Topic> getTopic( + $grpc.ServiceCall call, $0.GetTopicRequest request); + $async.Future<$0.ListTopicsResponse> listTopics_Pre($grpc.ServiceCall $call, $async.Future<$0.ListTopicsRequest> $request) async { return listTopics($call, await $request); } + $async.Future<$0.ListTopicsResponse> listTopics( + $grpc.ServiceCall call, $0.ListTopicsRequest request); + $async.Future<$0.ListTopicSubscriptionsResponse> listTopicSubscriptions_Pre( $grpc.ServiceCall $call, $async.Future<$0.ListTopicSubscriptionsRequest> $request) async { return listTopicSubscriptions($call, await $request); } + $async.Future<$0.ListTopicSubscriptionsResponse> listTopicSubscriptions( + $grpc.ServiceCall call, $0.ListTopicSubscriptionsRequest request); + $async.Future<$0.ListTopicSnapshotsResponse> listTopicSnapshots_Pre( $grpc.ServiceCall $call, $async.Future<$0.ListTopicSnapshotsRequest> $request) async { return listTopicSnapshots($call, await $request); } + $async.Future<$0.ListTopicSnapshotsResponse> listTopicSnapshots( + $grpc.ServiceCall call, $0.ListTopicSnapshotsRequest request); + $async.Future<$1.Empty> deleteTopic_Pre($grpc.ServiceCall $call, $async.Future<$0.DeleteTopicRequest> $request) async { return deleteTopic($call, await $request); } + $async.Future<$1.Empty> deleteTopic( + $grpc.ServiceCall call, $0.DeleteTopicRequest request); + $async.Future<$0.DetachSubscriptionResponse> detachSubscription_Pre( $grpc.ServiceCall $call, $async.Future<$0.DetachSubscriptionRequest> $request) async { return detachSubscription($call, await $request); } - $async.Future<$0.Topic> createTopic($grpc.ServiceCall call, $0.Topic request); - $async.Future<$0.Topic> updateTopic( - $grpc.ServiceCall call, $0.UpdateTopicRequest request); - $async.Future<$0.PublishResponse> publish( - $grpc.ServiceCall call, $0.PublishRequest request); - $async.Future<$0.Topic> getTopic( - $grpc.ServiceCall call, $0.GetTopicRequest request); - $async.Future<$0.ListTopicsResponse> listTopics( - $grpc.ServiceCall call, $0.ListTopicsRequest request); - $async.Future<$0.ListTopicSubscriptionsResponse> listTopicSubscriptions( - $grpc.ServiceCall call, $0.ListTopicSubscriptionsRequest request); - $async.Future<$0.ListTopicSnapshotsResponse> listTopicSnapshots( - $grpc.ServiceCall call, $0.ListTopicSnapshotsRequest request); - $async.Future<$1.Empty> deleteTopic( - $grpc.ServiceCall call, $0.DeleteTopicRequest request); $async.Future<$0.DetachSubscriptionResponse> detachSubscription( $grpc.ServiceCall call, $0.DetachSubscriptionRequest request); } @@ -317,88 +338,6 @@ class SubscriberClient extends $grpc.Client { 'https://www.googleapis.com/auth/pubsub', ]; - static final _$createSubscription = - $grpc.ClientMethod<$0.Subscription, $0.Subscription>( - '/google.pubsub.v1.Subscriber/CreateSubscription', - ($0.Subscription value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Subscription.fromBuffer(value)); - static final _$getSubscription = - $grpc.ClientMethod<$0.GetSubscriptionRequest, $0.Subscription>( - '/google.pubsub.v1.Subscriber/GetSubscription', - ($0.GetSubscriptionRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Subscription.fromBuffer(value)); - static final _$updateSubscription = - $grpc.ClientMethod<$0.UpdateSubscriptionRequest, $0.Subscription>( - '/google.pubsub.v1.Subscriber/UpdateSubscription', - ($0.UpdateSubscriptionRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Subscription.fromBuffer(value)); - static final _$listSubscriptions = $grpc.ClientMethod< - $0.ListSubscriptionsRequest, $0.ListSubscriptionsResponse>( - '/google.pubsub.v1.Subscriber/ListSubscriptions', - ($0.ListSubscriptionsRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $0.ListSubscriptionsResponse.fromBuffer(value)); - static final _$deleteSubscription = - $grpc.ClientMethod<$0.DeleteSubscriptionRequest, $1.Empty>( - '/google.pubsub.v1.Subscriber/DeleteSubscription', - ($0.DeleteSubscriptionRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); - static final _$modifyAckDeadline = - $grpc.ClientMethod<$0.ModifyAckDeadlineRequest, $1.Empty>( - '/google.pubsub.v1.Subscriber/ModifyAckDeadline', - ($0.ModifyAckDeadlineRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); - static final _$acknowledge = - $grpc.ClientMethod<$0.AcknowledgeRequest, $1.Empty>( - '/google.pubsub.v1.Subscriber/Acknowledge', - ($0.AcknowledgeRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); - static final _$pull = $grpc.ClientMethod<$0.PullRequest, $0.PullResponse>( - '/google.pubsub.v1.Subscriber/Pull', - ($0.PullRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.PullResponse.fromBuffer(value)); - static final _$streamingPull = - $grpc.ClientMethod<$0.StreamingPullRequest, $0.StreamingPullResponse>( - '/google.pubsub.v1.Subscriber/StreamingPull', - ($0.StreamingPullRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $0.StreamingPullResponse.fromBuffer(value)); - static final _$modifyPushConfig = - $grpc.ClientMethod<$0.ModifyPushConfigRequest, $1.Empty>( - '/google.pubsub.v1.Subscriber/ModifyPushConfig', - ($0.ModifyPushConfigRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); - static final _$getSnapshot = - $grpc.ClientMethod<$0.GetSnapshotRequest, $0.Snapshot>( - '/google.pubsub.v1.Subscriber/GetSnapshot', - ($0.GetSnapshotRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Snapshot.fromBuffer(value)); - static final _$listSnapshots = - $grpc.ClientMethod<$0.ListSnapshotsRequest, $0.ListSnapshotsResponse>( - '/google.pubsub.v1.Subscriber/ListSnapshots', - ($0.ListSnapshotsRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $0.ListSnapshotsResponse.fromBuffer(value)); - static final _$createSnapshot = - $grpc.ClientMethod<$0.CreateSnapshotRequest, $0.Snapshot>( - '/google.pubsub.v1.Subscriber/CreateSnapshot', - ($0.CreateSnapshotRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Snapshot.fromBuffer(value)); - static final _$updateSnapshot = - $grpc.ClientMethod<$0.UpdateSnapshotRequest, $0.Snapshot>( - '/google.pubsub.v1.Subscriber/UpdateSnapshot', - ($0.UpdateSnapshotRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.Snapshot.fromBuffer(value)); - static final _$deleteSnapshot = - $grpc.ClientMethod<$0.DeleteSnapshotRequest, $1.Empty>( - '/google.pubsub.v1.Subscriber/DeleteSnapshot', - ($0.DeleteSnapshotRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); - static final _$seek = $grpc.ClientMethod<$0.SeekRequest, $0.SeekResponse>( - '/google.pubsub.v1.Subscriber/Seek', - ($0.SeekRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.SeekResponse.fromBuffer(value)); - SubscriberClient(super.channel, {super.options, super.interceptors}); /// Creates a subscription to a given topic. See the [resource name rules] @@ -413,15 +352,17 @@ class SubscriberClient extends $grpc.Client { /// generated name is populated in the returned Subscription object. Note that /// for REST API requests, you must specify a name in the request. $grpc.ResponseFuture<$0.Subscription> createSubscription( - $0.Subscription request, - {$grpc.CallOptions? options}) { + $0.Subscription request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$createSubscription, request, options: options); } /// Gets the configuration details of a subscription. $grpc.ResponseFuture<$0.Subscription> getSubscription( - $0.GetSubscriptionRequest request, - {$grpc.CallOptions? options}) { + $0.GetSubscriptionRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$getSubscription, request, options: options); } @@ -429,15 +370,17 @@ class SubscriberClient extends $grpc.Client { /// update mask. Note that certain properties of a subscription, such as its /// topic, are not modifiable. $grpc.ResponseFuture<$0.Subscription> updateSubscription( - $0.UpdateSubscriptionRequest request, - {$grpc.CallOptions? options}) { + $0.UpdateSubscriptionRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$updateSubscription, request, options: options); } /// Lists matching subscriptions. $grpc.ResponseFuture<$0.ListSubscriptionsResponse> listSubscriptions( - $0.ListSubscriptionsRequest request, - {$grpc.CallOptions? options}) { + $0.ListSubscriptionsRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$listSubscriptions, request, options: options); } @@ -447,8 +390,9 @@ class SubscriberClient extends $grpc.Client { /// the same name, but the new one has no association with the old /// subscription or its topic unless the same topic is specified. $grpc.ResponseFuture<$1.Empty> deleteSubscription( - $0.DeleteSubscriptionRequest request, - {$grpc.CallOptions? options}) { + $0.DeleteSubscriptionRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$deleteSubscription, request, options: options); } @@ -458,8 +402,9 @@ class SubscriberClient extends $grpc.Client { /// processing was interrupted. Note that this does not modify the /// subscription-level `ackDeadlineSeconds` used for subsequent messages. $grpc.ResponseFuture<$1.Empty> modifyAckDeadline( - $0.ModifyAckDeadlineRequest request, - {$grpc.CallOptions? options}) { + $0.ModifyAckDeadlineRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$modifyAckDeadline, request, options: options); } @@ -470,14 +415,18 @@ class SubscriberClient extends $grpc.Client { /// Acknowledging a message whose ack deadline has expired may succeed, /// but such a message may be redelivered later. Acknowledging a message more /// than once will not result in an error. - $grpc.ResponseFuture<$1.Empty> acknowledge($0.AcknowledgeRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$1.Empty> acknowledge( + $0.AcknowledgeRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$acknowledge, request, options: options); } /// Pulls messages from the server. - $grpc.ResponseFuture<$0.PullResponse> pull($0.PullRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.PullResponse> pull( + $0.PullRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$pull, request, options: options); } @@ -489,8 +438,9 @@ class SubscriberClient extends $grpc.Client { /// re-establish the stream. Flow control can be achieved by configuring the /// underlying RPC channel. $grpc.ResponseStream<$0.StreamingPullResponse> streamingPull( - $async.Stream<$0.StreamingPullRequest> request, - {$grpc.CallOptions? options}) { + $async.Stream<$0.StreamingPullRequest> request, { + $grpc.CallOptions? options, + }) { return $createStreamingCall(_$streamingPull, request, options: options); } @@ -501,8 +451,9 @@ class SubscriberClient extends $grpc.Client { /// attributes of a push subscription. Messages will accumulate for delivery /// continuously through the call regardless of changes to the `PushConfig`. $grpc.ResponseFuture<$1.Empty> modifyPushConfig( - $0.ModifyPushConfigRequest request, - {$grpc.CallOptions? options}) { + $0.ModifyPushConfigRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$modifyPushConfig, request, options: options); } @@ -511,8 +462,10 @@ class SubscriberClient extends $grpc.Client { /// which allow you to manage message acknowledgments in bulk. That is, you can /// set the acknowledgment state of messages in an existing subscription to the /// state captured by a snapshot. - $grpc.ResponseFuture<$0.Snapshot> getSnapshot($0.GetSnapshotRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Snapshot> getSnapshot( + $0.GetSnapshotRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$getSnapshot, request, options: options); } @@ -522,8 +475,9 @@ class SubscriberClient extends $grpc.Client { /// the acknowledgment state of messages in an existing subscription to the /// state captured by a snapshot. $grpc.ResponseFuture<$0.ListSnapshotsResponse> listSnapshots( - $0.ListSnapshotsRequest request, - {$grpc.CallOptions? options}) { + $0.ListSnapshotsRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$listSnapshots, request, options: options); } @@ -544,8 +498,9 @@ class SubscriberClient extends $grpc.Client { /// generated name is populated in the returned Snapshot object. Note that for /// REST API requests, you must specify a name in the request. $grpc.ResponseFuture<$0.Snapshot> createSnapshot( - $0.CreateSnapshotRequest request, - {$grpc.CallOptions? options}) { + $0.CreateSnapshotRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$createSnapshot, request, options: options); } @@ -556,8 +511,9 @@ class SubscriberClient extends $grpc.Client { /// set the acknowledgment state of messages in an existing subscription to the /// state captured by a snapshot. $grpc.ResponseFuture<$0.Snapshot> updateSnapshot( - $0.UpdateSnapshotRequest request, - {$grpc.CallOptions? options}) { + $0.UpdateSnapshotRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$updateSnapshot, request, options: options); } @@ -571,8 +527,9 @@ class SubscriberClient extends $grpc.Client { /// created with the same name, but the new one has no association with the old /// snapshot or its subscription, unless the same subscription is specified. $grpc.ResponseFuture<$1.Empty> deleteSnapshot( - $0.DeleteSnapshotRequest request, - {$grpc.CallOptions? options}) { + $0.DeleteSnapshotRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$deleteSnapshot, request, options: options); } @@ -583,10 +540,93 @@ class SubscriberClient extends $grpc.Client { /// the acknowledgment state of messages in an existing subscription to the /// state captured by a snapshot. Note that both the subscription and the /// snapshot must be on the same topic. - $grpc.ResponseFuture<$0.SeekResponse> seek($0.SeekRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.SeekResponse> seek( + $0.SeekRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$seek, request, options: options); } + + // method descriptors + + static final _$createSubscription = + $grpc.ClientMethod<$0.Subscription, $0.Subscription>( + '/google.pubsub.v1.Subscriber/CreateSubscription', + ($0.Subscription value) => value.writeToBuffer(), + $0.Subscription.fromBuffer); + static final _$getSubscription = + $grpc.ClientMethod<$0.GetSubscriptionRequest, $0.Subscription>( + '/google.pubsub.v1.Subscriber/GetSubscription', + ($0.GetSubscriptionRequest value) => value.writeToBuffer(), + $0.Subscription.fromBuffer); + static final _$updateSubscription = + $grpc.ClientMethod<$0.UpdateSubscriptionRequest, $0.Subscription>( + '/google.pubsub.v1.Subscriber/UpdateSubscription', + ($0.UpdateSubscriptionRequest value) => value.writeToBuffer(), + $0.Subscription.fromBuffer); + static final _$listSubscriptions = $grpc.ClientMethod< + $0.ListSubscriptionsRequest, $0.ListSubscriptionsResponse>( + '/google.pubsub.v1.Subscriber/ListSubscriptions', + ($0.ListSubscriptionsRequest value) => value.writeToBuffer(), + $0.ListSubscriptionsResponse.fromBuffer); + static final _$deleteSubscription = + $grpc.ClientMethod<$0.DeleteSubscriptionRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/DeleteSubscription', + ($0.DeleteSubscriptionRequest value) => value.writeToBuffer(), + $1.Empty.fromBuffer); + static final _$modifyAckDeadline = + $grpc.ClientMethod<$0.ModifyAckDeadlineRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/ModifyAckDeadline', + ($0.ModifyAckDeadlineRequest value) => value.writeToBuffer(), + $1.Empty.fromBuffer); + static final _$acknowledge = + $grpc.ClientMethod<$0.AcknowledgeRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/Acknowledge', + ($0.AcknowledgeRequest value) => value.writeToBuffer(), + $1.Empty.fromBuffer); + static final _$pull = $grpc.ClientMethod<$0.PullRequest, $0.PullResponse>( + '/google.pubsub.v1.Subscriber/Pull', + ($0.PullRequest value) => value.writeToBuffer(), + $0.PullResponse.fromBuffer); + static final _$streamingPull = + $grpc.ClientMethod<$0.StreamingPullRequest, $0.StreamingPullResponse>( + '/google.pubsub.v1.Subscriber/StreamingPull', + ($0.StreamingPullRequest value) => value.writeToBuffer(), + $0.StreamingPullResponse.fromBuffer); + static final _$modifyPushConfig = + $grpc.ClientMethod<$0.ModifyPushConfigRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/ModifyPushConfig', + ($0.ModifyPushConfigRequest value) => value.writeToBuffer(), + $1.Empty.fromBuffer); + static final _$getSnapshot = + $grpc.ClientMethod<$0.GetSnapshotRequest, $0.Snapshot>( + '/google.pubsub.v1.Subscriber/GetSnapshot', + ($0.GetSnapshotRequest value) => value.writeToBuffer(), + $0.Snapshot.fromBuffer); + static final _$listSnapshots = + $grpc.ClientMethod<$0.ListSnapshotsRequest, $0.ListSnapshotsResponse>( + '/google.pubsub.v1.Subscriber/ListSnapshots', + ($0.ListSnapshotsRequest value) => value.writeToBuffer(), + $0.ListSnapshotsResponse.fromBuffer); + static final _$createSnapshot = + $grpc.ClientMethod<$0.CreateSnapshotRequest, $0.Snapshot>( + '/google.pubsub.v1.Subscriber/CreateSnapshot', + ($0.CreateSnapshotRequest value) => value.writeToBuffer(), + $0.Snapshot.fromBuffer); + static final _$updateSnapshot = + $grpc.ClientMethod<$0.UpdateSnapshotRequest, $0.Snapshot>( + '/google.pubsub.v1.Subscriber/UpdateSnapshot', + ($0.UpdateSnapshotRequest value) => value.writeToBuffer(), + $0.Snapshot.fromBuffer); + static final _$deleteSnapshot = + $grpc.ClientMethod<$0.DeleteSnapshotRequest, $1.Empty>( + '/google.pubsub.v1.Subscriber/DeleteSnapshot', + ($0.DeleteSnapshotRequest value) => value.writeToBuffer(), + $1.Empty.fromBuffer); + static final _$seek = $grpc.ClientMethod<$0.SeekRequest, $0.SeekResponse>( + '/google.pubsub.v1.Subscriber/Seek', + ($0.SeekRequest value) => value.writeToBuffer(), + $0.SeekResponse.fromBuffer); } @$pb.GrpcServiceName('google.pubsub.v1.Subscriber') @@ -730,108 +770,123 @@ abstract class SubscriberServiceBase extends $grpc.Service { return createSubscription($call, await $request); } + $async.Future<$0.Subscription> createSubscription( + $grpc.ServiceCall call, $0.Subscription request); + $async.Future<$0.Subscription> getSubscription_Pre($grpc.ServiceCall $call, $async.Future<$0.GetSubscriptionRequest> $request) async { return getSubscription($call, await $request); } + $async.Future<$0.Subscription> getSubscription( + $grpc.ServiceCall call, $0.GetSubscriptionRequest request); + $async.Future<$0.Subscription> updateSubscription_Pre($grpc.ServiceCall $call, $async.Future<$0.UpdateSubscriptionRequest> $request) async { return updateSubscription($call, await $request); } + $async.Future<$0.Subscription> updateSubscription( + $grpc.ServiceCall call, $0.UpdateSubscriptionRequest request); + $async.Future<$0.ListSubscriptionsResponse> listSubscriptions_Pre( $grpc.ServiceCall $call, $async.Future<$0.ListSubscriptionsRequest> $request) async { return listSubscriptions($call, await $request); } + $async.Future<$0.ListSubscriptionsResponse> listSubscriptions( + $grpc.ServiceCall call, $0.ListSubscriptionsRequest request); + $async.Future<$1.Empty> deleteSubscription_Pre($grpc.ServiceCall $call, $async.Future<$0.DeleteSubscriptionRequest> $request) async { return deleteSubscription($call, await $request); } + $async.Future<$1.Empty> deleteSubscription( + $grpc.ServiceCall call, $0.DeleteSubscriptionRequest request); + $async.Future<$1.Empty> modifyAckDeadline_Pre($grpc.ServiceCall $call, $async.Future<$0.ModifyAckDeadlineRequest> $request) async { return modifyAckDeadline($call, await $request); } + $async.Future<$1.Empty> modifyAckDeadline( + $grpc.ServiceCall call, $0.ModifyAckDeadlineRequest request); + $async.Future<$1.Empty> acknowledge_Pre($grpc.ServiceCall $call, $async.Future<$0.AcknowledgeRequest> $request) async { return acknowledge($call, await $request); } + $async.Future<$1.Empty> acknowledge( + $grpc.ServiceCall call, $0.AcknowledgeRequest request); + $async.Future<$0.PullResponse> pull_Pre( $grpc.ServiceCall $call, $async.Future<$0.PullRequest> $request) async { return pull($call, await $request); } + $async.Future<$0.PullResponse> pull( + $grpc.ServiceCall call, $0.PullRequest request); + + $async.Stream<$0.StreamingPullResponse> streamingPull( + $grpc.ServiceCall call, $async.Stream<$0.StreamingPullRequest> request); + $async.Future<$1.Empty> modifyPushConfig_Pre($grpc.ServiceCall $call, $async.Future<$0.ModifyPushConfigRequest> $request) async { return modifyPushConfig($call, await $request); } + $async.Future<$1.Empty> modifyPushConfig( + $grpc.ServiceCall call, $0.ModifyPushConfigRequest request); + $async.Future<$0.Snapshot> getSnapshot_Pre($grpc.ServiceCall $call, $async.Future<$0.GetSnapshotRequest> $request) async { return getSnapshot($call, await $request); } + $async.Future<$0.Snapshot> getSnapshot( + $grpc.ServiceCall call, $0.GetSnapshotRequest request); + $async.Future<$0.ListSnapshotsResponse> listSnapshots_Pre( $grpc.ServiceCall $call, $async.Future<$0.ListSnapshotsRequest> $request) async { return listSnapshots($call, await $request); } + $async.Future<$0.ListSnapshotsResponse> listSnapshots( + $grpc.ServiceCall call, $0.ListSnapshotsRequest request); + $async.Future<$0.Snapshot> createSnapshot_Pre($grpc.ServiceCall $call, $async.Future<$0.CreateSnapshotRequest> $request) async { return createSnapshot($call, await $request); } + $async.Future<$0.Snapshot> createSnapshot( + $grpc.ServiceCall call, $0.CreateSnapshotRequest request); + $async.Future<$0.Snapshot> updateSnapshot_Pre($grpc.ServiceCall $call, $async.Future<$0.UpdateSnapshotRequest> $request) async { return updateSnapshot($call, await $request); } + $async.Future<$0.Snapshot> updateSnapshot( + $grpc.ServiceCall call, $0.UpdateSnapshotRequest request); + $async.Future<$1.Empty> deleteSnapshot_Pre($grpc.ServiceCall $call, $async.Future<$0.DeleteSnapshotRequest> $request) async { return deleteSnapshot($call, await $request); } + $async.Future<$1.Empty> deleteSnapshot( + $grpc.ServiceCall call, $0.DeleteSnapshotRequest request); + $async.Future<$0.SeekResponse> seek_Pre( $grpc.ServiceCall $call, $async.Future<$0.SeekRequest> $request) async { return seek($call, await $request); } - $async.Future<$0.Subscription> createSubscription( - $grpc.ServiceCall call, $0.Subscription request); - $async.Future<$0.Subscription> getSubscription( - $grpc.ServiceCall call, $0.GetSubscriptionRequest request); - $async.Future<$0.Subscription> updateSubscription( - $grpc.ServiceCall call, $0.UpdateSubscriptionRequest request); - $async.Future<$0.ListSubscriptionsResponse> listSubscriptions( - $grpc.ServiceCall call, $0.ListSubscriptionsRequest request); - $async.Future<$1.Empty> deleteSubscription( - $grpc.ServiceCall call, $0.DeleteSubscriptionRequest request); - $async.Future<$1.Empty> modifyAckDeadline( - $grpc.ServiceCall call, $0.ModifyAckDeadlineRequest request); - $async.Future<$1.Empty> acknowledge( - $grpc.ServiceCall call, $0.AcknowledgeRequest request); - $async.Future<$0.PullResponse> pull( - $grpc.ServiceCall call, $0.PullRequest request); - $async.Stream<$0.StreamingPullResponse> streamingPull( - $grpc.ServiceCall call, $async.Stream<$0.StreamingPullRequest> request); - $async.Future<$1.Empty> modifyPushConfig( - $grpc.ServiceCall call, $0.ModifyPushConfigRequest request); - $async.Future<$0.Snapshot> getSnapshot( - $grpc.ServiceCall call, $0.GetSnapshotRequest request); - $async.Future<$0.ListSnapshotsResponse> listSnapshots( - $grpc.ServiceCall call, $0.ListSnapshotsRequest request); - $async.Future<$0.Snapshot> createSnapshot( - $grpc.ServiceCall call, $0.CreateSnapshotRequest request); - $async.Future<$0.Snapshot> updateSnapshot( - $grpc.ServiceCall call, $0.UpdateSnapshotRequest request); - $async.Future<$1.Empty> deleteSnapshot( - $grpc.ServiceCall call, $0.DeleteSnapshotRequest request); $async.Future<$0.SeekResponse> seek( $grpc.ServiceCall call, $0.SeekRequest request); } diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbjson.dart deleted file mode 100644 index b1a20bf1..00000000 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/pubsub.pbjson.dart +++ /dev/null @@ -1,3139 +0,0 @@ -// -// Generated code. Do not modify. -// source: google/pubsub/v1/pubsub.proto -// -// @dart = 3.3 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:convert' as $convert; -import 'dart:core' as $core; -import 'dart:typed_data' as $typed_data; - -@$core.Deprecated('Use messageStoragePolicyDescriptor instead') -const MessageStoragePolicy$json = { - '1': 'MessageStoragePolicy', - '2': [ - { - '1': 'allowed_persistence_regions', - '3': 1, - '4': 3, - '5': 9, - '8': {}, - '10': 'allowedPersistenceRegions' - }, - { - '1': 'enforce_in_transit', - '3': 2, - '4': 1, - '5': 8, - '8': {}, - '10': 'enforceInTransit' - }, - ], -}; - -/// Descriptor for `MessageStoragePolicy`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List messageStoragePolicyDescriptor = $convert.base64Decode( - 'ChRNZXNzYWdlU3RvcmFnZVBvbGljeRJDChthbGxvd2VkX3BlcnNpc3RlbmNlX3JlZ2lvbnMYAS' - 'ADKAlCA+BBAVIZYWxsb3dlZFBlcnNpc3RlbmNlUmVnaW9ucxIxChJlbmZvcmNlX2luX3RyYW5z' - 'aXQYAiABKAhCA+BBAVIQZW5mb3JjZUluVHJhbnNpdA=='); - -@$core.Deprecated('Use schemaSettingsDescriptor instead') -const SchemaSettings$json = { - '1': 'SchemaSettings', - '2': [ - {'1': 'schema', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'schema'}, - { - '1': 'encoding', - '3': 2, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.Encoding', - '8': {}, - '10': 'encoding' - }, - { - '1': 'first_revision_id', - '3': 3, - '4': 1, - '5': 9, - '8': {}, - '10': 'firstRevisionId' - }, - { - '1': 'last_revision_id', - '3': 4, - '4': 1, - '5': 9, - '8': {}, - '10': 'lastRevisionId' - }, - ], -}; - -/// Descriptor for `SchemaSettings`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List schemaSettingsDescriptor = $convert.base64Decode( - 'Cg5TY2hlbWFTZXR0aW5ncxI8CgZzY2hlbWEYASABKAlCJOBBAvpBHgoccHVic3ViLmdvb2dsZW' - 'FwaXMuY29tL1NjaGVtYVIGc2NoZW1hEjsKCGVuY29kaW5nGAIgASgOMhouZ29vZ2xlLnB1YnN1' - 'Yi52MS5FbmNvZGluZ0ID4EEBUghlbmNvZGluZxIvChFmaXJzdF9yZXZpc2lvbl9pZBgDIAEoCU' - 'ID4EEBUg9maXJzdFJldmlzaW9uSWQSLQoQbGFzdF9yZXZpc2lvbl9pZBgEIAEoCUID4EEBUg5s' - 'YXN0UmV2aXNpb25JZA=='); - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings$json = { - '1': 'IngestionDataSourceSettings', - '2': [ - { - '1': 'aws_kinesis', - '3': 1, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.AwsKinesis', - '8': {}, - '9': 0, - '10': 'awsKinesis' - }, - { - '1': 'cloud_storage', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage', - '8': {}, - '9': 0, - '10': 'cloudStorage' - }, - { - '1': 'azure_event_hubs', - '3': 3, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.AzureEventHubs', - '8': {}, - '9': 0, - '10': 'azureEventHubs' - }, - { - '1': 'aws_msk', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.AwsMsk', - '8': {}, - '9': 0, - '10': 'awsMsk' - }, - { - '1': 'confluent_cloud', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.ConfluentCloud', - '8': {}, - '9': 0, - '10': 'confluentCloud' - }, - { - '1': 'platform_logs_settings', - '3': 4, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.PlatformLogsSettings', - '8': {}, - '10': 'platformLogsSettings' - }, - ], - '3': [ - IngestionDataSourceSettings_AwsKinesis$json, - IngestionDataSourceSettings_CloudStorage$json, - IngestionDataSourceSettings_AzureEventHubs$json, - IngestionDataSourceSettings_AwsMsk$json, - IngestionDataSourceSettings_ConfluentCloud$json - ], - '8': [ - {'1': 'source'}, - ], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_AwsKinesis$json = { - '1': 'AwsKinesis', - '2': [ - { - '1': 'state', - '3': 1, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.AwsKinesis.State', - '8': {}, - '10': 'state' - }, - {'1': 'stream_arn', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'streamArn'}, - {'1': 'consumer_arn', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'consumerArn'}, - {'1': 'aws_role_arn', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'awsRoleArn'}, - { - '1': 'gcp_service_account', - '3': 5, - '4': 1, - '5': 9, - '8': {}, - '10': 'gcpServiceAccount' - }, - ], - '4': [IngestionDataSourceSettings_AwsKinesis_State$json], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_AwsKinesis_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'KINESIS_PERMISSION_DENIED', '2': 2}, - {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, - {'1': 'STREAM_NOT_FOUND', '2': 4}, - {'1': 'CONSUMER_NOT_FOUND', '2': 5}, - ], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_CloudStorage$json = { - '1': 'CloudStorage', - '2': [ - { - '1': 'state', - '3': 1, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage.State', - '8': {}, - '10': 'state' - }, - {'1': 'bucket', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'bucket'}, - { - '1': 'text_format', - '3': 3, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage.TextFormat', - '8': {}, - '9': 0, - '10': 'textFormat' - }, - { - '1': 'avro_format', - '3': 4, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage.AvroFormat', - '8': {}, - '9': 0, - '10': 'avroFormat' - }, - { - '1': 'pubsub_avro_format', - '3': 5, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionDataSourceSettings.CloudStorage.PubSubAvroFormat', - '8': {}, - '9': 0, - '10': 'pubsubAvroFormat' - }, - { - '1': 'minimum_object_create_time', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.protobuf.Timestamp', - '8': {}, - '10': 'minimumObjectCreateTime' - }, - {'1': 'match_glob', '3': 9, '4': 1, '5': 9, '8': {}, '10': 'matchGlob'}, - ], - '3': [ - IngestionDataSourceSettings_CloudStorage_TextFormat$json, - IngestionDataSourceSettings_CloudStorage_AvroFormat$json, - IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat$json - ], - '4': [IngestionDataSourceSettings_CloudStorage_State$json], - '8': [ - {'1': 'input_format'}, - ], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_CloudStorage_TextFormat$json = { - '1': 'TextFormat', - '2': [ - { - '1': 'delimiter', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '9': 0, - '10': 'delimiter', - '17': true - }, - ], - '8': [ - {'1': '_delimiter'}, - ], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_CloudStorage_AvroFormat$json = { - '1': 'AvroFormat', -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_CloudStorage_PubSubAvroFormat$json = { - '1': 'PubSubAvroFormat', -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_CloudStorage_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'CLOUD_STORAGE_PERMISSION_DENIED', '2': 2}, - {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, - {'1': 'BUCKET_NOT_FOUND', '2': 4}, - {'1': 'TOO_MANY_OBJECTS', '2': 5}, - ], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_AzureEventHubs$json = { - '1': 'AzureEventHubs', - '2': [ - { - '1': 'state', - '3': 1, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.AzureEventHubs.State', - '8': {}, - '10': 'state' - }, - { - '1': 'resource_group', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'resourceGroup' - }, - {'1': 'namespace', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'namespace'}, - {'1': 'event_hub', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'eventHub'}, - {'1': 'client_id', '3': 5, '4': 1, '5': 9, '8': {}, '10': 'clientId'}, - {'1': 'tenant_id', '3': 6, '4': 1, '5': 9, '8': {}, '10': 'tenantId'}, - { - '1': 'subscription_id', - '3': 7, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscriptionId' - }, - { - '1': 'gcp_service_account', - '3': 8, - '4': 1, - '5': 9, - '8': {}, - '10': 'gcpServiceAccount' - }, - ], - '4': [IngestionDataSourceSettings_AzureEventHubs_State$json], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_AzureEventHubs_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'EVENT_HUBS_PERMISSION_DENIED', '2': 2}, - {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, - {'1': 'NAMESPACE_NOT_FOUND', '2': 4}, - {'1': 'EVENT_HUB_NOT_FOUND', '2': 5}, - {'1': 'SUBSCRIPTION_NOT_FOUND', '2': 6}, - {'1': 'RESOURCE_GROUP_NOT_FOUND', '2': 7}, - ], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_AwsMsk$json = { - '1': 'AwsMsk', - '2': [ - { - '1': 'state', - '3': 1, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.AwsMsk.State', - '8': {}, - '10': 'state' - }, - {'1': 'cluster_arn', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'clusterArn'}, - {'1': 'topic', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - {'1': 'aws_role_arn', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'awsRoleArn'}, - { - '1': 'gcp_service_account', - '3': 5, - '4': 1, - '5': 9, - '8': {}, - '10': 'gcpServiceAccount' - }, - ], - '4': [IngestionDataSourceSettings_AwsMsk_State$json], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_AwsMsk_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'MSK_PERMISSION_DENIED', '2': 2}, - {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, - {'1': 'CLUSTER_NOT_FOUND', '2': 4}, - {'1': 'TOPIC_NOT_FOUND', '2': 5}, - ], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_ConfluentCloud$json = { - '1': 'ConfluentCloud', - '2': [ - { - '1': 'state', - '3': 1, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.IngestionDataSourceSettings.ConfluentCloud.State', - '8': {}, - '10': 'state' - }, - { - '1': 'bootstrap_server', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'bootstrapServer' - }, - {'1': 'cluster_id', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'clusterId'}, - {'1': 'topic', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - { - '1': 'identity_pool_id', - '3': 5, - '4': 1, - '5': 9, - '8': {}, - '10': 'identityPoolId' - }, - { - '1': 'gcp_service_account', - '3': 6, - '4': 1, - '5': 9, - '8': {}, - '10': 'gcpServiceAccount' - }, - ], - '4': [IngestionDataSourceSettings_ConfluentCloud_State$json], -}; - -@$core.Deprecated('Use ingestionDataSourceSettingsDescriptor instead') -const IngestionDataSourceSettings_ConfluentCloud_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'CONFLUENT_CLOUD_PERMISSION_DENIED', '2': 2}, - {'1': 'PUBLISH_PERMISSION_DENIED', '2': 3}, - {'1': 'UNREACHABLE_BOOTSTRAP_SERVER', '2': 4}, - {'1': 'CLUSTER_NOT_FOUND', '2': 5}, - {'1': 'TOPIC_NOT_FOUND', '2': 6}, - ], -}; - -/// Descriptor for `IngestionDataSourceSettings`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List ingestionDataSourceSettingsDescriptor = $convert.base64Decode( - 'ChtJbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MSYAoLYXdzX2tpbmVzaXMYASABKAsyOC5nb2' - '9nbGUucHVic3ViLnYxLkluZ2VzdGlvbkRhdGFTb3VyY2VTZXR0aW5ncy5Bd3NLaW5lc2lzQgPg' - 'QQFIAFIKYXdzS2luZXNpcxJmCg1jbG91ZF9zdG9yYWdlGAIgASgLMjouZ29vZ2xlLnB1YnN1Yi' - '52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MuQ2xvdWRTdG9yYWdlQgPgQQFIAFIMY2xv' - 'dWRTdG9yYWdlEm0KEGF6dXJlX2V2ZW50X2h1YnMYAyABKAsyPC5nb29nbGUucHVic3ViLnYxLk' - 'luZ2VzdGlvbkRhdGFTb3VyY2VTZXR0aW5ncy5BenVyZUV2ZW50SHVic0ID4EEBSABSDmF6dXJl' - 'RXZlbnRIdWJzElQKB2F3c19tc2sYBSABKAsyNC5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbk' - 'RhdGFTb3VyY2VTZXR0aW5ncy5Bd3NNc2tCA+BBAUgAUgZhd3NNc2sSbAoPY29uZmx1ZW50X2Ns' - 'b3VkGAYgASgLMjwuZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3' - 'MuQ29uZmx1ZW50Q2xvdWRCA+BBAUgAUg5jb25mbHVlbnRDbG91ZBJhChZwbGF0Zm9ybV9sb2dz' - 'X3NldHRpbmdzGAQgASgLMiYuZ29vZ2xlLnB1YnN1Yi52MS5QbGF0Zm9ybUxvZ3NTZXR0aW5nc0' - 'ID4EEBUhRwbGF0Zm9ybUxvZ3NTZXR0aW5ncxqoAwoKQXdzS2luZXNpcxJZCgVzdGF0ZRgBIAEo' - 'DjI+Lmdvb2dsZS5wdWJzdWIudjEuSW5nZXN0aW9uRGF0YVNvdXJjZVNldHRpbmdzLkF3c0tpbm' - 'VzaXMuU3RhdGVCA+BBA1IFc3RhdGUSIgoKc3RyZWFtX2FybhgCIAEoCUID4EECUglzdHJlYW1B' - 'cm4SJgoMY29uc3VtZXJfYXJuGAMgASgJQgPgQQJSC2NvbnN1bWVyQXJuEiUKDGF3c19yb2xlX2' - 'FybhgEIAEoCUID4EECUgphd3NSb2xlQXJuEjMKE2djcF9zZXJ2aWNlX2FjY291bnQYBSABKAlC' - 'A+BBAlIRZ2NwU2VydmljZUFjY291bnQilgEKBVN0YXRlEhUKEVNUQVRFX1VOU1BFQ0lGSUVEEA' - 'ASCgoGQUNUSVZFEAESHQoZS0lORVNJU19QRVJNSVNTSU9OX0RFTklFRBACEh0KGVBVQkxJU0hf' - 'UEVSTUlTU0lPTl9ERU5JRUQQAxIUChBTVFJFQU1fTk9UX0ZPVU5EEAQSFgoSQ09OU1VNRVJfTk' - '9UX0ZPVU5EEAUa/gYKDENsb3VkU3RvcmFnZRJbCgVzdGF0ZRgBIAEoDjJALmdvb2dsZS5wdWJz' - 'dWIudjEuSW5nZXN0aW9uRGF0YVNvdXJjZVNldHRpbmdzLkNsb3VkU3RvcmFnZS5TdGF0ZUID4E' - 'EDUgVzdGF0ZRIbCgZidWNrZXQYAiABKAlCA+BBAVIGYnVja2V0Em0KC3RleHRfZm9ybWF0GAMg' - 'ASgLMkUuZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MuQ2xvdW' - 'RTdG9yYWdlLlRleHRGb3JtYXRCA+BBAUgAUgp0ZXh0Rm9ybWF0Em0KC2F2cm9fZm9ybWF0GAQg' - 'ASgLMkUuZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MuQ2xvdW' - 'RTdG9yYWdlLkF2cm9Gb3JtYXRCA+BBAUgAUgphdnJvRm9ybWF0EoABChJwdWJzdWJfYXZyb19m' - 'b3JtYXQYBSABKAsySy5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkRhdGFTb3VyY2VTZXR0aW' - '5ncy5DbG91ZFN0b3JhZ2UuUHViU3ViQXZyb0Zvcm1hdEID4EEBSABSEHB1YnN1YkF2cm9Gb3Jt' - 'YXQSXAoabWluaW11bV9vYmplY3RfY3JlYXRlX3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idW' - 'YuVGltZXN0YW1wQgPgQQFSF21pbmltdW1PYmplY3RDcmVhdGVUaW1lEiIKCm1hdGNoX2dsb2IY' - 'CSABKAlCA+BBAVIJbWF0Y2hHbG9iGkIKClRleHRGb3JtYXQSJgoJZGVsaW1pdGVyGAEgASgJQg' - 'PgQQFIAFIJZGVsaW1pdGVyiAEBQgwKCl9kZWxpbWl0ZXIaDAoKQXZyb0Zvcm1hdBoSChBQdWJT' - 'dWJBdnJvRm9ybWF0IpoBCgVTdGF0ZRIVChFTVEFURV9VTlNQRUNJRklFRBAAEgoKBkFDVElWRR' - 'ABEiMKH0NMT1VEX1NUT1JBR0VfUEVSTUlTU0lPTl9ERU5JRUQQAhIdChlQVUJMSVNIX1BFUk1J' - 'U1NJT05fREVOSUVEEAMSFAoQQlVDS0VUX05PVF9GT1VORBAEEhQKEFRPT19NQU5ZX09CSkVDVF' - 'MQBUIOCgxpbnB1dF9mb3JtYXQa4QQKDkF6dXJlRXZlbnRIdWJzEl0KBXN0YXRlGAEgASgOMkIu' - 'Z29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3MuQXp1cmVFdmVudE' - 'h1YnMuU3RhdGVCA+BBA1IFc3RhdGUSKgoOcmVzb3VyY2VfZ3JvdXAYAiABKAlCA+BBAVINcmVz' - 'b3VyY2VHcm91cBIhCgluYW1lc3BhY2UYAyABKAlCA+BBAVIJbmFtZXNwYWNlEiAKCWV2ZW50X2' - 'h1YhgEIAEoCUID4EEBUghldmVudEh1YhIgCgljbGllbnRfaWQYBSABKAlCA+BBAVIIY2xpZW50' - 'SWQSIAoJdGVuYW50X2lkGAYgASgJQgPgQQFSCHRlbmFudElkEiwKD3N1YnNjcmlwdGlvbl9pZB' - 'gHIAEoCUID4EEBUg5zdWJzY3JpcHRpb25JZBIzChNnY3Bfc2VydmljZV9hY2NvdW50GAggASgJ' - 'QgPgQQFSEWdjcFNlcnZpY2VBY2NvdW50ItcBCgVTdGF0ZRIVChFTVEFURV9VTlNQRUNJRklFRB' - 'AAEgoKBkFDVElWRRABEiAKHEVWRU5UX0hVQlNfUEVSTUlTU0lPTl9ERU5JRUQQAhIdChlQVUJM' - 'SVNIX1BFUk1JU1NJT05fREVOSUVEEAMSFwoTTkFNRVNQQUNFX05PVF9GT1VORBAEEhcKE0VWRU' - '5UX0hVQl9OT1RfRk9VTkQQBRIaChZTVUJTQ1JJUFRJT05fTk9UX0ZPVU5EEAYSHAoYUkVTT1VS' - 'Q0VfR1JPVVBfTk9UX0ZPVU5EEAcarwMKBkF3c01zaxJVCgVzdGF0ZRgBIAEoDjI6Lmdvb2dsZS' - '5wdWJzdWIudjEuSW5nZXN0aW9uRGF0YVNvdXJjZVNldHRpbmdzLkF3c01zay5TdGF0ZUID4EED' - 'UgVzdGF0ZRIkCgtjbHVzdGVyX2FybhgCIAEoCUID4EECUgpjbHVzdGVyQXJuEjkKBXRvcGljGA' - 'MgASgJQiPgQQL6QR0KG3B1YnN1Yi5nb29nbGVhcGlzLmNvbS9Ub3BpY1IFdG9waWMSJQoMYXdz' - 'X3JvbGVfYXJuGAQgASgJQgPgQQJSCmF3c1JvbGVBcm4SMwoTZ2NwX3NlcnZpY2VfYWNjb3VudB' - 'gFIAEoCUID4EECUhFnY3BTZXJ2aWNlQWNjb3VudCKQAQoFU3RhdGUSFQoRU1RBVEVfVU5TUEVD' - 'SUZJRUQQABIKCgZBQ1RJVkUQARIZChVNU0tfUEVSTUlTU0lPTl9ERU5JRUQQAhIdChlQVUJMSV' - 'NIX1BFUk1JU1NJT05fREVOSUVEEAMSFQoRQ0xVU1RFUl9OT1RfRk9VTkQQBBITCg9UT1BJQ19O' - 'T1RfRk9VTkQQBRqDBAoOQ29uZmx1ZW50Q2xvdWQSXQoFc3RhdGUYASABKA4yQi5nb29nbGUucH' - 'Vic3ViLnYxLkluZ2VzdGlvbkRhdGFTb3VyY2VTZXR0aW5ncy5Db25mbHVlbnRDbG91ZC5TdGF0' - 'ZUID4EEDUgVzdGF0ZRIuChBib290c3RyYXBfc2VydmVyGAIgASgJQgPgQQJSD2Jvb3RzdHJhcF' - 'NlcnZlchIiCgpjbHVzdGVyX2lkGAMgASgJQgPgQQJSCWNsdXN0ZXJJZBIZCgV0b3BpYxgEIAEo' - 'CUID4EECUgV0b3BpYxItChBpZGVudGl0eV9wb29sX2lkGAUgASgJQgPgQQJSDmlkZW50aXR5UG' - '9vbElkEjMKE2djcF9zZXJ2aWNlX2FjY291bnQYBiABKAlCA+BBAlIRZ2NwU2VydmljZUFjY291' - 'bnQivgEKBVN0YXRlEhUKEVNUQVRFX1VOU1BFQ0lGSUVEEAASCgoGQUNUSVZFEAESJQohQ09ORk' - 'xVRU5UX0NMT1VEX1BFUk1JU1NJT05fREVOSUVEEAISHQoZUFVCTElTSF9QRVJNSVNTSU9OX0RF' - 'TklFRBADEiAKHFVOUkVBQ0hBQkxFX0JPT1RTVFJBUF9TRVJWRVIQBBIVChFDTFVTVEVSX05PVF' - '9GT1VORBAFEhMKD1RPUElDX05PVF9GT1VORBAGQggKBnNvdXJjZQ=='); - -@$core.Deprecated('Use platformLogsSettingsDescriptor instead') -const PlatformLogsSettings$json = { - '1': 'PlatformLogsSettings', - '2': [ - { - '1': 'severity', - '3': 1, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.PlatformLogsSettings.Severity', - '8': {}, - '10': 'severity' - }, - ], - '4': [PlatformLogsSettings_Severity$json], -}; - -@$core.Deprecated('Use platformLogsSettingsDescriptor instead') -const PlatformLogsSettings_Severity$json = { - '1': 'Severity', - '2': [ - {'1': 'SEVERITY_UNSPECIFIED', '2': 0}, - {'1': 'DISABLED', '2': 1}, - {'1': 'DEBUG', '2': 2}, - {'1': 'INFO', '2': 3}, - {'1': 'WARNING', '2': 4}, - {'1': 'ERROR', '2': 5}, - ], -}; - -/// Descriptor for `PlatformLogsSettings`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List platformLogsSettingsDescriptor = $convert.base64Decode( - 'ChRQbGF0Zm9ybUxvZ3NTZXR0aW5ncxJQCghzZXZlcml0eRgBIAEoDjIvLmdvb2dsZS5wdWJzdW' - 'IudjEuUGxhdGZvcm1Mb2dzU2V0dGluZ3MuU2V2ZXJpdHlCA+BBAVIIc2V2ZXJpdHkiXwoIU2V2' - 'ZXJpdHkSGAoUU0VWRVJJVFlfVU5TUEVDSUZJRUQQABIMCghESVNBQkxFRBABEgkKBURFQlVHEA' - 'ISCAoESU5GTxADEgsKB1dBUk5JTkcQBBIJCgVFUlJPUhAF'); - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent$json = { - '1': 'IngestionFailureEvent', - '2': [ - {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - { - '1': 'error_message', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'errorMessage' - }, - { - '1': 'cloud_storage_failure', - '3': 3, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.CloudStorageFailure', - '8': {}, - '9': 0, - '10': 'cloudStorageFailure' - }, - { - '1': 'aws_msk_failure', - '3': 4, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.AwsMskFailureReason', - '8': {}, - '9': 0, - '10': 'awsMskFailure' - }, - { - '1': 'azure_event_hubs_failure', - '3': 5, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionFailureEvent.AzureEventHubsFailureReason', - '8': {}, - '9': 0, - '10': 'azureEventHubsFailure' - }, - { - '1': 'confluent_cloud_failure', - '3': 6, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionFailureEvent.ConfluentCloudFailureReason', - '8': {}, - '9': 0, - '10': 'confluentCloudFailure' - }, - { - '1': 'aws_kinesis_failure', - '3': 7, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.AwsKinesisFailureReason', - '8': {}, - '9': 0, - '10': 'awsKinesisFailure' - }, - ], - '3': [ - IngestionFailureEvent_ApiViolationReason$json, - IngestionFailureEvent_AvroFailureReason$json, - IngestionFailureEvent_SchemaViolationReason$json, - IngestionFailureEvent_MessageTransformationFailureReason$json, - IngestionFailureEvent_CloudStorageFailure$json, - IngestionFailureEvent_AwsMskFailureReason$json, - IngestionFailureEvent_AzureEventHubsFailureReason$json, - IngestionFailureEvent_ConfluentCloudFailureReason$json, - IngestionFailureEvent_AwsKinesisFailureReason$json - ], - '8': [ - {'1': 'failure'}, - ], -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_ApiViolationReason$json = { - '1': 'ApiViolationReason', -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_AvroFailureReason$json = { - '1': 'AvroFailureReason', -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_SchemaViolationReason$json = { - '1': 'SchemaViolationReason', -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_MessageTransformationFailureReason$json = { - '1': 'MessageTransformationFailureReason', -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_CloudStorageFailure$json = { - '1': 'CloudStorageFailure', - '2': [ - {'1': 'bucket', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'bucket'}, - {'1': 'object_name', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'objectName'}, - { - '1': 'object_generation', - '3': 3, - '4': 1, - '5': 3, - '8': {}, - '10': 'objectGeneration' - }, - { - '1': 'avro_failure_reason', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.AvroFailureReason', - '8': {}, - '9': 0, - '10': 'avroFailureReason' - }, - { - '1': 'api_violation_reason', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', - '8': {}, - '9': 0, - '10': 'apiViolationReason' - }, - { - '1': 'schema_violation_reason', - '3': 7, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', - '8': {}, - '9': 0, - '10': 'schemaViolationReason' - }, - { - '1': 'message_transformation_failure_reason', - '3': 8, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', - '8': {}, - '9': 0, - '10': 'messageTransformationFailureReason' - }, - ], - '8': [ - {'1': 'reason'}, - ], -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_AwsMskFailureReason$json = { - '1': 'AwsMskFailureReason', - '2': [ - {'1': 'cluster_arn', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'clusterArn'}, - {'1': 'kafka_topic', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'kafkaTopic'}, - {'1': 'partition_id', '3': 3, '4': 1, '5': 3, '8': {}, '10': 'partitionId'}, - {'1': 'offset', '3': 4, '4': 1, '5': 3, '8': {}, '10': 'offset'}, - { - '1': 'api_violation_reason', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', - '8': {}, - '9': 0, - '10': 'apiViolationReason' - }, - { - '1': 'schema_violation_reason', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', - '8': {}, - '9': 0, - '10': 'schemaViolationReason' - }, - { - '1': 'message_transformation_failure_reason', - '3': 7, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', - '8': {}, - '9': 0, - '10': 'messageTransformationFailureReason' - }, - ], - '8': [ - {'1': 'reason'}, - ], -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_AzureEventHubsFailureReason$json = { - '1': 'AzureEventHubsFailureReason', - '2': [ - {'1': 'namespace', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'namespace'}, - {'1': 'event_hub', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'eventHub'}, - {'1': 'partition_id', '3': 3, '4': 1, '5': 3, '8': {}, '10': 'partitionId'}, - {'1': 'offset', '3': 4, '4': 1, '5': 3, '8': {}, '10': 'offset'}, - { - '1': 'api_violation_reason', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', - '8': {}, - '9': 0, - '10': 'apiViolationReason' - }, - { - '1': 'schema_violation_reason', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', - '8': {}, - '9': 0, - '10': 'schemaViolationReason' - }, - { - '1': 'message_transformation_failure_reason', - '3': 7, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', - '8': {}, - '9': 0, - '10': 'messageTransformationFailureReason' - }, - ], - '8': [ - {'1': 'reason'}, - ], -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_ConfluentCloudFailureReason$json = { - '1': 'ConfluentCloudFailureReason', - '2': [ - {'1': 'cluster_id', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'clusterId'}, - {'1': 'kafka_topic', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'kafkaTopic'}, - {'1': 'partition_id', '3': 3, '4': 1, '5': 3, '8': {}, '10': 'partitionId'}, - {'1': 'offset', '3': 4, '4': 1, '5': 3, '8': {}, '10': 'offset'}, - { - '1': 'api_violation_reason', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', - '8': {}, - '9': 0, - '10': 'apiViolationReason' - }, - { - '1': 'schema_violation_reason', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', - '8': {}, - '9': 0, - '10': 'schemaViolationReason' - }, - { - '1': 'message_transformation_failure_reason', - '3': 7, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', - '8': {}, - '9': 0, - '10': 'messageTransformationFailureReason' - }, - ], - '8': [ - {'1': 'reason'}, - ], -}; - -@$core.Deprecated('Use ingestionFailureEventDescriptor instead') -const IngestionFailureEvent_AwsKinesisFailureReason$json = { - '1': 'AwsKinesisFailureReason', - '2': [ - {'1': 'stream_arn', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'streamArn'}, - { - '1': 'partition_key', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'partitionKey' - }, - { - '1': 'sequence_number', - '3': 3, - '4': 1, - '5': 9, - '8': {}, - '10': 'sequenceNumber' - }, - { - '1': 'schema_violation_reason', - '3': 4, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.SchemaViolationReason', - '8': {}, - '9': 0, - '10': 'schemaViolationReason' - }, - { - '1': 'message_transformation_failure_reason', - '3': 5, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.IngestionFailureEvent.MessageTransformationFailureReason', - '8': {}, - '9': 0, - '10': 'messageTransformationFailureReason' - }, - { - '1': 'api_violation_reason', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionFailureEvent.ApiViolationReason', - '8': {}, - '9': 0, - '10': 'apiViolationReason' - }, - ], - '8': [ - {'1': 'reason'}, - ], -}; - -/// Descriptor for `IngestionFailureEvent`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List ingestionFailureEventDescriptor = $convert.base64Decode( - 'ChVJbmdlc3Rpb25GYWlsdXJlRXZlbnQSOQoFdG9waWMYASABKAlCI+BBAvpBHQobcHVic3ViLm' - 'dvb2dsZWFwaXMuY29tL1RvcGljUgV0b3BpYxIoCg1lcnJvcl9tZXNzYWdlGAIgASgJQgPgQQJS' - 'DGVycm9yTWVzc2FnZRJ2ChVjbG91ZF9zdG9yYWdlX2ZhaWx1cmUYAyABKAsyOy5nb29nbGUucH' - 'Vic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5DbG91ZFN0b3JhZ2VGYWlsdXJlQgPgQQFI' - 'AFITY2xvdWRTdG9yYWdlRmFpbHVyZRJqCg9hd3NfbXNrX2ZhaWx1cmUYBCABKAsyOy5nb29nbG' - 'UucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5Bd3NNc2tGYWlsdXJlUmVhc29uQgPg' - 'QQFIAFINYXdzTXNrRmFpbHVyZRKDAQoYYXp1cmVfZXZlbnRfaHVic19mYWlsdXJlGAUgASgLMk' - 'MuZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuQXp1cmVFdmVudEh1YnNG' - 'YWlsdXJlUmVhc29uQgPgQQFIAFIVYXp1cmVFdmVudEh1YnNGYWlsdXJlEoIBChdjb25mbHVlbn' - 'RfY2xvdWRfZmFpbHVyZRgGIAEoCzJDLmdvb2dsZS5wdWJzdWIudjEuSW5nZXN0aW9uRmFpbHVy' - 'ZUV2ZW50LkNvbmZsdWVudENsb3VkRmFpbHVyZVJlYXNvbkID4EEBSABSFWNvbmZsdWVudENsb3' - 'VkRmFpbHVyZRJ2ChNhd3Nfa2luZXNpc19mYWlsdXJlGAcgASgLMj8uZ29vZ2xlLnB1YnN1Yi52' - 'MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuQXdzS2luZXNpc0ZhaWx1cmVSZWFzb25CA+BBAUgAUh' - 'Fhd3NLaW5lc2lzRmFpbHVyZRoUChJBcGlWaW9sYXRpb25SZWFzb24aEwoRQXZyb0ZhaWx1cmVS' - 'ZWFzb24aFwoVU2NoZW1hVmlvbGF0aW9uUmVhc29uGiQKIk1lc3NhZ2VUcmFuc2Zvcm1hdGlvbk' - 'ZhaWx1cmVSZWFzb24aoAUKE0Nsb3VkU3RvcmFnZUZhaWx1cmUSGwoGYnVja2V0GAEgASgJQgPg' - 'QQFSBmJ1Y2tldBIkCgtvYmplY3RfbmFtZRgCIAEoCUID4EEBUgpvYmplY3ROYW1lEjAKEW9iam' - 'VjdF9nZW5lcmF0aW9uGAMgASgDQgPgQQFSEG9iamVjdEdlbmVyYXRpb24ScAoTYXZyb19mYWls' - 'dXJlX3JlYXNvbhgFIAEoCzI5Lmdvb2dsZS5wdWJzdWIudjEuSW5nZXN0aW9uRmFpbHVyZUV2ZW' - '50LkF2cm9GYWlsdXJlUmVhc29uQgPgQQFIAFIRYXZyb0ZhaWx1cmVSZWFzb24ScwoUYXBpX3Zp' - 'b2xhdGlvbl9yZWFzb24YBiABKAsyOi5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cm' - 'VFdmVudC5BcGlWaW9sYXRpb25SZWFzb25CA+BBAUgAUhJhcGlWaW9sYXRpb25SZWFzb24SfAoX' - 'c2NoZW1hX3Zpb2xhdGlvbl9yZWFzb24YByABKAsyPS5nb29nbGUucHVic3ViLnYxLkluZ2VzdG' - 'lvbkZhaWx1cmVFdmVudC5TY2hlbWFWaW9sYXRpb25SZWFzb25CA+BBAUgAUhVzY2hlbWFWaW9s' - 'YXRpb25SZWFzb24SpAEKJW1lc3NhZ2VfdHJhbnNmb3JtYXRpb25fZmFpbHVyZV9yZWFzb24YCC' - 'ABKAsySi5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5NZXNzYWdlVHJh' - 'bnNmb3JtYXRpb25GYWlsdXJlUmVhc29uQgPgQQFIAFIibWVzc2FnZVRyYW5zZm9ybWF0aW9uRm' - 'FpbHVyZVJlYXNvbkIICgZyZWFzb24aygQKE0F3c01za0ZhaWx1cmVSZWFzb24SJAoLY2x1c3Rl' - 'cl9hcm4YASABKAlCA+BBAVIKY2x1c3RlckFybhIkCgtrYWZrYV90b3BpYxgCIAEoCUID4EEBUg' - 'prYWZrYVRvcGljEiYKDHBhcnRpdGlvbl9pZBgDIAEoA0ID4EEBUgtwYXJ0aXRpb25JZBIbCgZv' - 'ZmZzZXQYBCABKANCA+BBAVIGb2Zmc2V0EnMKFGFwaV92aW9sYXRpb25fcmVhc29uGAUgASgLMj' - 'ouZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuQXBpVmlvbGF0aW9uUmVh' - 'c29uQgPgQQFIAFISYXBpVmlvbGF0aW9uUmVhc29uEnwKF3NjaGVtYV92aW9sYXRpb25fcmVhc2' - '9uGAYgASgLMj0uZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuU2NoZW1h' - 'VmlvbGF0aW9uUmVhc29uQgPgQQFIAFIVc2NoZW1hVmlvbGF0aW9uUmVhc29uEqQBCiVtZXNzYW' - 'dlX3RyYW5zZm9ybWF0aW9uX2ZhaWx1cmVfcmVhc29uGAcgASgLMkouZ29vZ2xlLnB1YnN1Yi52' - 'MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuTWVzc2FnZVRyYW5zZm9ybWF0aW9uRmFpbHVyZVJlYX' - 'NvbkID4EEBSABSIm1lc3NhZ2VUcmFuc2Zvcm1hdGlvbkZhaWx1cmVSZWFzb25CCAoGcmVhc29u' - 'GssEChtBenVyZUV2ZW50SHVic0ZhaWx1cmVSZWFzb24SIQoJbmFtZXNwYWNlGAEgASgJQgPgQQ' - 'FSCW5hbWVzcGFjZRIgCglldmVudF9odWIYAiABKAlCA+BBAVIIZXZlbnRIdWISJgoMcGFydGl0' - 'aW9uX2lkGAMgASgDQgPgQQFSC3BhcnRpdGlvbklkEhsKBm9mZnNldBgEIAEoA0ID4EEBUgZvZm' - 'ZzZXQScwoUYXBpX3Zpb2xhdGlvbl9yZWFzb24YBSABKAsyOi5nb29nbGUucHVic3ViLnYxLklu' - 'Z2VzdGlvbkZhaWx1cmVFdmVudC5BcGlWaW9sYXRpb25SZWFzb25CA+BBAUgAUhJhcGlWaW9sYX' - 'Rpb25SZWFzb24SfAoXc2NoZW1hX3Zpb2xhdGlvbl9yZWFzb24YBiABKAsyPS5nb29nbGUucHVi' - 'c3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5TY2hlbWFWaW9sYXRpb25SZWFzb25CA+BBAU' - 'gAUhVzY2hlbWFWaW9sYXRpb25SZWFzb24SpAEKJW1lc3NhZ2VfdHJhbnNmb3JtYXRpb25fZmFp' - 'bHVyZV9yZWFzb24YByABKAsySi5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdm' - 'VudC5NZXNzYWdlVHJhbnNmb3JtYXRpb25GYWlsdXJlUmVhc29uQgPgQQFIAFIibWVzc2FnZVRy' - 'YW5zZm9ybWF0aW9uRmFpbHVyZVJlYXNvbkIICgZyZWFzb24a0AQKG0NvbmZsdWVudENsb3VkRm' - 'FpbHVyZVJlYXNvbhIiCgpjbHVzdGVyX2lkGAEgASgJQgPgQQFSCWNsdXN0ZXJJZBIkCgtrYWZr' - 'YV90b3BpYxgCIAEoCUID4EEBUgprYWZrYVRvcGljEiYKDHBhcnRpdGlvbl9pZBgDIAEoA0ID4E' - 'EBUgtwYXJ0aXRpb25JZBIbCgZvZmZzZXQYBCABKANCA+BBAVIGb2Zmc2V0EnMKFGFwaV92aW9s' - 'YXRpb25fcmVhc29uGAUgASgLMjouZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRX' - 'ZlbnQuQXBpVmlvbGF0aW9uUmVhc29uQgPgQQFIAFISYXBpVmlvbGF0aW9uUmVhc29uEnwKF3Nj' - 'aGVtYV92aW9sYXRpb25fcmVhc29uGAYgASgLMj0uZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb2' - '5GYWlsdXJlRXZlbnQuU2NoZW1hVmlvbGF0aW9uUmVhc29uQgPgQQFIAFIVc2NoZW1hVmlvbGF0' - 'aW9uUmVhc29uEqQBCiVtZXNzYWdlX3RyYW5zZm9ybWF0aW9uX2ZhaWx1cmVfcmVhc29uGAcgAS' - 'gLMkouZ29vZ2xlLnB1YnN1Yi52MS5Jbmdlc3Rpb25GYWlsdXJlRXZlbnQuTWVzc2FnZVRyYW5z' - 'Zm9ybWF0aW9uRmFpbHVyZVJlYXNvbkID4EEBSABSIm1lc3NhZ2VUcmFuc2Zvcm1hdGlvbkZhaW' - 'x1cmVSZWFzb25CCAoGcmVhc29uGrkEChdBd3NLaW5lc2lzRmFpbHVyZVJlYXNvbhIiCgpzdHJl' - 'YW1fYXJuGAEgASgJQgPgQQFSCXN0cmVhbUFybhIoCg1wYXJ0aXRpb25fa2V5GAIgASgJQgPgQQ' - 'FSDHBhcnRpdGlvbktleRIsCg9zZXF1ZW5jZV9udW1iZXIYAyABKAlCA+BBAVIOc2VxdWVuY2VO' - 'dW1iZXISfAoXc2NoZW1hX3Zpb2xhdGlvbl9yZWFzb24YBCABKAsyPS5nb29nbGUucHVic3ViLn' - 'YxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5TY2hlbWFWaW9sYXRpb25SZWFzb25CA+BBAUgAUhVz' - 'Y2hlbWFWaW9sYXRpb25SZWFzb24SpAEKJW1lc3NhZ2VfdHJhbnNmb3JtYXRpb25fZmFpbHVyZV' - '9yZWFzb24YBSABKAsySi5nb29nbGUucHVic3ViLnYxLkluZ2VzdGlvbkZhaWx1cmVFdmVudC5N' - 'ZXNzYWdlVHJhbnNmb3JtYXRpb25GYWlsdXJlUmVhc29uQgPgQQFIAFIibWVzc2FnZVRyYW5zZm' - '9ybWF0aW9uRmFpbHVyZVJlYXNvbhJzChRhcGlfdmlvbGF0aW9uX3JlYXNvbhgGIAEoCzI6Lmdv' - 'b2dsZS5wdWJzdWIudjEuSW5nZXN0aW9uRmFpbHVyZUV2ZW50LkFwaVZpb2xhdGlvblJlYXNvbk' - 'ID4EEBSABSEmFwaVZpb2xhdGlvblJlYXNvbkIICgZyZWFzb25CCQoHZmFpbHVyZQ=='); - -@$core.Deprecated('Use javaScriptUDFDescriptor instead') -const JavaScriptUDF$json = { - '1': 'JavaScriptUDF', - '2': [ - { - '1': 'function_name', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'functionName' - }, - {'1': 'code', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'code'}, - ], -}; - -/// Descriptor for `JavaScriptUDF`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List javaScriptUDFDescriptor = $convert.base64Decode( - 'Cg1KYXZhU2NyaXB0VURGEigKDWZ1bmN0aW9uX25hbWUYASABKAlCA+BBAlIMZnVuY3Rpb25OYW' - '1lEhcKBGNvZGUYAiABKAlCA+BBAlIEY29kZQ=='); - -@$core.Deprecated('Use aIInferenceDescriptor instead') -const AIInference$json = { - '1': 'AIInference', - '2': [ - {'1': 'endpoint', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'endpoint'}, - { - '1': 'unstructured_inference', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.AIInference.UnstructuredInference', - '8': {}, - '9': 0, - '10': 'unstructuredInference' - }, - { - '1': 'service_account_email', - '3': 3, - '4': 1, - '5': 9, - '8': {}, - '10': 'serviceAccountEmail' - }, - ], - '3': [AIInference_UnstructuredInference$json], - '8': [ - {'1': 'inference_mode'}, - ], -}; - -@$core.Deprecated('Use aIInferenceDescriptor instead') -const AIInference_UnstructuredInference$json = { - '1': 'UnstructuredInference', - '2': [ - { - '1': 'parameters', - '3': 1, - '4': 1, - '5': 11, - '6': '.google.protobuf.Struct', - '8': {}, - '10': 'parameters' - }, - ], -}; - -/// Descriptor for `AIInference`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List aIInferenceDescriptor = $convert.base64Decode( - 'CgtBSUluZmVyZW5jZRIfCghlbmRwb2ludBgBIAEoCUID4EECUghlbmRwb2ludBJxChZ1bnN0cn' - 'VjdHVyZWRfaW5mZXJlbmNlGAIgASgLMjMuZ29vZ2xlLnB1YnN1Yi52MS5BSUluZmVyZW5jZS5V' - 'bnN0cnVjdHVyZWRJbmZlcmVuY2VCA+BBAUgAUhV1bnN0cnVjdHVyZWRJbmZlcmVuY2USNwoVc2' - 'VydmljZV9hY2NvdW50X2VtYWlsGAMgASgJQgPgQQFSE3NlcnZpY2VBY2NvdW50RW1haWwaVQoV' - 'VW5zdHJ1Y3R1cmVkSW5mZXJlbmNlEjwKCnBhcmFtZXRlcnMYASABKAsyFy5nb29nbGUucHJvdG' - '9idWYuU3RydWN0QgPgQQFSCnBhcmFtZXRlcnNCEAoOaW5mZXJlbmNlX21vZGU='); - -@$core.Deprecated('Use messageTransformDescriptor instead') -const MessageTransform$json = { - '1': 'MessageTransform', - '2': [ - { - '1': 'javascript_udf', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.JavaScriptUDF', - '8': {}, - '9': 0, - '10': 'javascriptUdf' - }, - { - '1': 'ai_inference', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.AIInference', - '8': {}, - '9': 0, - '10': 'aiInference' - }, - { - '1': 'enabled', - '3': 3, - '4': 1, - '5': 8, - '8': {'3': true}, - '10': 'enabled', - }, - {'1': 'disabled', '3': 4, '4': 1, '5': 8, '8': {}, '10': 'disabled'}, - ], - '8': [ - {'1': 'transform'}, - ], -}; - -/// Descriptor for `MessageTransform`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List messageTransformDescriptor = $convert.base64Decode( - 'ChBNZXNzYWdlVHJhbnNmb3JtEk0KDmphdmFzY3JpcHRfdWRmGAIgASgLMh8uZ29vZ2xlLnB1Yn' - 'N1Yi52MS5KYXZhU2NyaXB0VURGQgPgQQFIAFINamF2YXNjcmlwdFVkZhJHCgxhaV9pbmZlcmVu' - 'Y2UYBiABKAsyHS5nb29nbGUucHVic3ViLnYxLkFJSW5mZXJlbmNlQgPgQQFIAFILYWlJbmZlcm' - 'VuY2USHwoHZW5hYmxlZBgDIAEoCEIFGAHgQQFSB2VuYWJsZWQSHwoIZGlzYWJsZWQYBCABKAhC' - 'A+BBAVIIZGlzYWJsZWRCCwoJdHJhbnNmb3Jt'); - -@$core.Deprecated('Use topicDescriptor instead') -const Topic$json = { - '1': 'Topic', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - { - '1': 'labels', - '3': 2, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Topic.LabelsEntry', - '8': {}, - '10': 'labels' - }, - { - '1': 'message_storage_policy', - '3': 3, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.MessageStoragePolicy', - '8': {}, - '10': 'messageStoragePolicy' - }, - {'1': 'kms_key_name', '3': 5, '4': 1, '5': 9, '8': {}, '10': 'kmsKeyName'}, - { - '1': 'schema_settings', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.SchemaSettings', - '8': {}, - '10': 'schemaSettings' - }, - { - '1': 'satisfies_pzs', - '3': 7, - '4': 1, - '5': 8, - '8': {}, - '10': 'satisfiesPzs' - }, - { - '1': 'message_retention_duration', - '3': 8, - '4': 1, - '5': 11, - '6': '.google.protobuf.Duration', - '8': {}, - '10': 'messageRetentionDuration' - }, - { - '1': 'state', - '3': 9, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.Topic.State', - '8': {}, - '10': 'state' - }, - { - '1': 'ingestion_data_source_settings', - '3': 10, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.IngestionDataSourceSettings', - '8': {}, - '10': 'ingestionDataSourceSettings' - }, - { - '1': 'message_transforms', - '3': 13, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.MessageTransform', - '8': {}, - '10': 'messageTransforms' - }, - { - '1': 'tags', - '3': 14, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Topic.TagsEntry', - '8': {}, - '10': 'tags' - }, - ], - '3': [Topic_LabelsEntry$json, Topic_TagsEntry$json], - '4': [Topic_State$json], - '7': {}, -}; - -@$core.Deprecated('Use topicDescriptor instead') -const Topic_LabelsEntry$json = { - '1': 'LabelsEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -@$core.Deprecated('Use topicDescriptor instead') -const Topic_TagsEntry$json = { - '1': 'TagsEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -@$core.Deprecated('Use topicDescriptor instead') -const Topic_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'INGESTION_RESOURCE_ERROR', '2': 2}, - ], -}; - -/// Descriptor for `Topic`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List topicDescriptor = $convert.base64Decode( - 'CgVUb3BpYxIaCgRuYW1lGAEgASgJQgbgQQLgQQhSBG5hbWUSQAoGbGFiZWxzGAIgAygLMiMuZ2' - '9vZ2xlLnB1YnN1Yi52MS5Ub3BpYy5MYWJlbHNFbnRyeUID4EEBUgZsYWJlbHMSYQoWbWVzc2Fn' - 'ZV9zdG9yYWdlX3BvbGljeRgDIAEoCzImLmdvb2dsZS5wdWJzdWIudjEuTWVzc2FnZVN0b3JhZ2' - 'VQb2xpY3lCA+BBAVIUbWVzc2FnZVN0b3JhZ2VQb2xpY3kSSwoMa21zX2tleV9uYW1lGAUgASgJ' - 'QingQQH6QSMKIWNsb3Vka21zLmdvb2dsZWFwaXMuY29tL0NyeXB0b0tleVIKa21zS2V5TmFtZR' - 'JOCg9zY2hlbWFfc2V0dGluZ3MYBiABKAsyIC5nb29nbGUucHVic3ViLnYxLlNjaGVtYVNldHRp' - 'bmdzQgPgQQFSDnNjaGVtYVNldHRpbmdzEigKDXNhdGlzZmllc19wenMYByABKAhCA+BBAVIMc2' - 'F0aXNmaWVzUHpzElwKGm1lc3NhZ2VfcmV0ZW50aW9uX2R1cmF0aW9uGAggASgLMhkuZ29vZ2xl' - 'LnByb3RvYnVmLkR1cmF0aW9uQgPgQQFSGG1lc3NhZ2VSZXRlbnRpb25EdXJhdGlvbhI4CgVzdG' - 'F0ZRgJIAEoDjIdLmdvb2dsZS5wdWJzdWIudjEuVG9waWMuU3RhdGVCA+BBA1IFc3RhdGUSdwoe' - 'aW5nZXN0aW9uX2RhdGFfc291cmNlX3NldHRpbmdzGAogASgLMi0uZ29vZ2xlLnB1YnN1Yi52MS' - '5Jbmdlc3Rpb25EYXRhU291cmNlU2V0dGluZ3NCA+BBAVIbaW5nZXN0aW9uRGF0YVNvdXJjZVNl' - 'dHRpbmdzElYKEm1lc3NhZ2VfdHJhbnNmb3JtcxgNIAMoCzIiLmdvb2dsZS5wdWJzdWIudjEuTW' - 'Vzc2FnZVRyYW5zZm9ybUID4EEBUhFtZXNzYWdlVHJhbnNmb3JtcxJACgR0YWdzGA4gAygLMiEu' - 'Z29vZ2xlLnB1YnN1Yi52MS5Ub3BpYy5UYWdzRW50cnlCCeBBBOBBBeBBAVIEdGFncxo5CgtMYW' - 'JlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBGjcK' - 'CVRhZ3NFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIk' - 'gKBVN0YXRlEhUKEVNUQVRFX1VOU1BFQ0lGSUVEEAASCgoGQUNUSVZFEAESHAoYSU5HRVNUSU9O' - 'X1JFU09VUkNFX0VSUk9SEAI6Y+pBYAobcHVic3ViLmdvb2dsZWFwaXMuY29tL1RvcGljEiFwcm' - '9qZWN0cy97cHJvamVjdH0vdG9waWNzL3t0b3BpY30SD19kZWxldGVkLXRvcGljXyoGdG9waWNz' - 'MgV0b3BpYw=='); - -@$core.Deprecated('Use pubsubMessageDescriptor instead') -const PubsubMessage$json = { - '1': 'PubsubMessage', - '2': [ - {'1': 'data', '3': 1, '4': 1, '5': 12, '8': {}, '10': 'data'}, - { - '1': 'attributes', - '3': 2, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.PubsubMessage.AttributesEntry', - '8': {}, - '10': 'attributes' - }, - {'1': 'message_id', '3': 3, '4': 1, '5': 9, '10': 'messageId'}, - { - '1': 'publish_time', - '3': 4, - '4': 1, - '5': 11, - '6': '.google.protobuf.Timestamp', - '10': 'publishTime' - }, - {'1': 'ordering_key', '3': 5, '4': 1, '5': 9, '8': {}, '10': 'orderingKey'}, - ], - '3': [PubsubMessage_AttributesEntry$json], -}; - -@$core.Deprecated('Use pubsubMessageDescriptor instead') -const PubsubMessage_AttributesEntry$json = { - '1': 'AttributesEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -/// Descriptor for `PubsubMessage`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List pubsubMessageDescriptor = $convert.base64Decode( - 'Cg1QdWJzdWJNZXNzYWdlEhcKBGRhdGEYASABKAxCA+BBAVIEZGF0YRJUCgphdHRyaWJ1dGVzGA' - 'IgAygLMi8uZ29vZ2xlLnB1YnN1Yi52MS5QdWJzdWJNZXNzYWdlLkF0dHJpYnV0ZXNFbnRyeUID' - '4EEBUgphdHRyaWJ1dGVzEh0KCm1lc3NhZ2VfaWQYAyABKAlSCW1lc3NhZ2VJZBI9CgxwdWJsaX' - 'NoX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgtwdWJsaXNoVGltZRIm' - 'CgxvcmRlcmluZ19rZXkYBSABKAlCA+BBAVILb3JkZXJpbmdLZXkaPQoPQXR0cmlidXRlc0VudH' - 'J5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE='); - -@$core.Deprecated('Use getTopicRequestDescriptor instead') -const GetTopicRequest$json = { - '1': 'GetTopicRequest', - '2': [ - {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - ], -}; - -/// Descriptor for `GetTopicRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List getTopicRequestDescriptor = $convert.base64Decode( - 'Cg9HZXRUb3BpY1JlcXVlc3QSOQoFdG9waWMYASABKAlCI+BBAvpBHQobcHVic3ViLmdvb2dsZW' - 'FwaXMuY29tL1RvcGljUgV0b3BpYw=='); - -@$core.Deprecated('Use updateTopicRequestDescriptor instead') -const UpdateTopicRequest$json = { - '1': 'UpdateTopicRequest', - '2': [ - { - '1': 'topic', - '3': 1, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.Topic', - '8': {}, - '10': 'topic' - }, - { - '1': 'update_mask', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.protobuf.FieldMask', - '8': {}, - '10': 'updateMask' - }, - ], -}; - -/// Descriptor for `UpdateTopicRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List updateTopicRequestDescriptor = $convert.base64Decode( - 'ChJVcGRhdGVUb3BpY1JlcXVlc3QSMgoFdG9waWMYASABKAsyFy5nb29nbGUucHVic3ViLnYxLl' - 'RvcGljQgPgQQJSBXRvcGljEkAKC3VwZGF0ZV9tYXNrGAIgASgLMhouZ29vZ2xlLnByb3RvYnVm' - 'LkZpZWxkTWFza0ID4EECUgp1cGRhdGVNYXNr'); - -@$core.Deprecated('Use publishRequestDescriptor instead') -const PublishRequest$json = { - '1': 'PublishRequest', - '2': [ - {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - { - '1': 'messages', - '3': 2, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.PubsubMessage', - '8': {}, - '10': 'messages' - }, - ], -}; - -/// Descriptor for `PublishRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List publishRequestDescriptor = $convert.base64Decode( - 'Cg5QdWJsaXNoUmVxdWVzdBI5CgV0b3BpYxgBIAEoCUIj4EEC+kEdChtwdWJzdWIuZ29vZ2xlYX' - 'Bpcy5jb20vVG9waWNSBXRvcGljEkAKCG1lc3NhZ2VzGAIgAygLMh8uZ29vZ2xlLnB1YnN1Yi52' - 'MS5QdWJzdWJNZXNzYWdlQgPgQQJSCG1lc3NhZ2Vz'); - -@$core.Deprecated('Use publishResponseDescriptor instead') -const PublishResponse$json = { - '1': 'PublishResponse', - '2': [ - {'1': 'message_ids', '3': 1, '4': 3, '5': 9, '8': {}, '10': 'messageIds'}, - ], -}; - -/// Descriptor for `PublishResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List publishResponseDescriptor = $convert.base64Decode( - 'Cg9QdWJsaXNoUmVzcG9uc2USJAoLbWVzc2FnZV9pZHMYASADKAlCA+BBAVIKbWVzc2FnZUlkcw' - '=='); - -@$core.Deprecated('Use listTopicsRequestDescriptor instead') -const ListTopicsRequest$json = { - '1': 'ListTopicsRequest', - '2': [ - {'1': 'project', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'project'}, - {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, - {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, - ], -}; - -/// Descriptor for `ListTopicsRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listTopicsRequestDescriptor = $convert.base64Decode( - 'ChFMaXN0VG9waWNzUmVxdWVzdBJNCgdwcm9qZWN0GAEgASgJQjPgQQL6QS0KK2Nsb3VkcmVzb3' - 'VyY2VtYW5hZ2VyLmdvb2dsZWFwaXMuY29tL1Byb2plY3RSB3Byb2plY3QSIAoJcGFnZV9zaXpl' - 'GAIgASgFQgPgQQFSCHBhZ2VTaXplEiIKCnBhZ2VfdG9rZW4YAyABKAlCA+BBAVIJcGFnZVRva2' - 'Vu'); - -@$core.Deprecated('Use listTopicsResponseDescriptor instead') -const ListTopicsResponse$json = { - '1': 'ListTopicsResponse', - '2': [ - { - '1': 'topics', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Topic', - '8': {}, - '10': 'topics' - }, - { - '1': 'next_page_token', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'nextPageToken' - }, - ], -}; - -/// Descriptor for `ListTopicsResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listTopicsResponseDescriptor = $convert.base64Decode( - 'ChJMaXN0VG9waWNzUmVzcG9uc2USNAoGdG9waWNzGAEgAygLMhcuZ29vZ2xlLnB1YnN1Yi52MS' - '5Ub3BpY0ID4EEBUgZ0b3BpY3MSKwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJQgPgQQFSDW5leHRQ' - 'YWdlVG9rZW4='); - -@$core.Deprecated('Use listTopicSubscriptionsRequestDescriptor instead') -const ListTopicSubscriptionsRequest$json = { - '1': 'ListTopicSubscriptionsRequest', - '2': [ - {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, - {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, - ], -}; - -/// Descriptor for `ListTopicSubscriptionsRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listTopicSubscriptionsRequestDescriptor = - $convert.base64Decode( - 'Ch1MaXN0VG9waWNTdWJzY3JpcHRpb25zUmVxdWVzdBI5CgV0b3BpYxgBIAEoCUIj4EEC+kEdCh' - 'twdWJzdWIuZ29vZ2xlYXBpcy5jb20vVG9waWNSBXRvcGljEiAKCXBhZ2Vfc2l6ZRgCIAEoBUID' - '4EEBUghwYWdlU2l6ZRIiCgpwYWdlX3Rva2VuGAMgASgJQgPgQQFSCXBhZ2VUb2tlbg=='); - -@$core.Deprecated('Use listTopicSubscriptionsResponseDescriptor instead') -const ListTopicSubscriptionsResponse$json = { - '1': 'ListTopicSubscriptionsResponse', - '2': [ - { - '1': 'subscriptions', - '3': 1, - '4': 3, - '5': 9, - '8': {}, - '10': 'subscriptions' - }, - { - '1': 'next_page_token', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'nextPageToken' - }, - ], -}; - -/// Descriptor for `ListTopicSubscriptionsResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listTopicSubscriptionsResponseDescriptor = - $convert.base64Decode( - 'Ch5MaXN0VG9waWNTdWJzY3JpcHRpb25zUmVzcG9uc2USUAoNc3Vic2NyaXB0aW9ucxgBIAMoCU' - 'Iq4EEB+kEkCiJwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU3Vic2NyaXB0aW9uUg1zdWJzY3JpcHRp' - 'b25zEisKD25leHRfcGFnZV90b2tlbhgCIAEoCUID4EEBUg1uZXh0UGFnZVRva2Vu'); - -@$core.Deprecated('Use listTopicSnapshotsRequestDescriptor instead') -const ListTopicSnapshotsRequest$json = { - '1': 'ListTopicSnapshotsRequest', - '2': [ - {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, - {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, - ], -}; - -/// Descriptor for `ListTopicSnapshotsRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listTopicSnapshotsRequestDescriptor = $convert.base64Decode( - 'ChlMaXN0VG9waWNTbmFwc2hvdHNSZXF1ZXN0EjkKBXRvcGljGAEgASgJQiPgQQL6QR0KG3B1Yn' - 'N1Yi5nb29nbGVhcGlzLmNvbS9Ub3BpY1IFdG9waWMSIAoJcGFnZV9zaXplGAIgASgFQgPgQQFS' - 'CHBhZ2VTaXplEiIKCnBhZ2VfdG9rZW4YAyABKAlCA+BBAVIJcGFnZVRva2Vu'); - -@$core.Deprecated('Use listTopicSnapshotsResponseDescriptor instead') -const ListTopicSnapshotsResponse$json = { - '1': 'ListTopicSnapshotsResponse', - '2': [ - {'1': 'snapshots', '3': 1, '4': 3, '5': 9, '8': {}, '10': 'snapshots'}, - { - '1': 'next_page_token', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'nextPageToken' - }, - ], -}; - -/// Descriptor for `ListTopicSnapshotsResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listTopicSnapshotsResponseDescriptor = - $convert.base64Decode( - 'ChpMaXN0VG9waWNTbmFwc2hvdHNSZXNwb25zZRJECglzbmFwc2hvdHMYASADKAlCJuBBAfpBIA' - 'oecHVic3ViLmdvb2dsZWFwaXMuY29tL1NuYXBzaG90UglzbmFwc2hvdHMSKwoPbmV4dF9wYWdl' - 'X3Rva2VuGAIgASgJQgPgQQFSDW5leHRQYWdlVG9rZW4='); - -@$core.Deprecated('Use deleteTopicRequestDescriptor instead') -const DeleteTopicRequest$json = { - '1': 'DeleteTopicRequest', - '2': [ - {'1': 'topic', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - ], -}; - -/// Descriptor for `DeleteTopicRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List deleteTopicRequestDescriptor = $convert.base64Decode( - 'ChJEZWxldGVUb3BpY1JlcXVlc3QSOQoFdG9waWMYASABKAlCI+BBAvpBHQobcHVic3ViLmdvb2' - 'dsZWFwaXMuY29tL1RvcGljUgV0b3BpYw=='); - -@$core.Deprecated('Use detachSubscriptionRequestDescriptor instead') -const DetachSubscriptionRequest$json = { - '1': 'DetachSubscriptionRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - ], -}; - -/// Descriptor for `DetachSubscriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List detachSubscriptionRequestDescriptor = - $convert.base64Decode( - 'ChlEZXRhY2hTdWJzY3JpcHRpb25SZXF1ZXN0Ek4KDHN1YnNjcmlwdGlvbhgBIAEoCUIq4EEC+k' - 'EkCiJwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU3Vic2NyaXB0aW9uUgxzdWJzY3JpcHRpb24='); - -@$core.Deprecated('Use detachSubscriptionResponseDescriptor instead') -const DetachSubscriptionResponse$json = { - '1': 'DetachSubscriptionResponse', -}; - -/// Descriptor for `DetachSubscriptionResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List detachSubscriptionResponseDescriptor = - $convert.base64Decode('ChpEZXRhY2hTdWJzY3JpcHRpb25SZXNwb25zZQ=='); - -@$core.Deprecated('Use subscriptionDescriptor instead') -const Subscription$json = { - '1': 'Subscription', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - {'1': 'topic', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - { - '1': 'push_config', - '3': 4, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.PushConfig', - '8': {}, - '10': 'pushConfig' - }, - { - '1': 'bigquery_config', - '3': 18, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.BigQueryConfig', - '8': {}, - '10': 'bigqueryConfig' - }, - { - '1': 'cloud_storage_config', - '3': 22, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.CloudStorageConfig', - '8': {}, - '10': 'cloudStorageConfig' - }, - { - '1': 'bigtable_config', - '3': 27, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.BigtableConfig', - '8': {}, - '10': 'bigtableConfig' - }, - { - '1': 'ack_deadline_seconds', - '3': 5, - '4': 1, - '5': 5, - '8': {}, - '10': 'ackDeadlineSeconds' - }, - { - '1': 'retain_acked_messages', - '3': 7, - '4': 1, - '5': 8, - '8': {}, - '10': 'retainAckedMessages' - }, - { - '1': 'message_retention_duration', - '3': 8, - '4': 1, - '5': 11, - '6': '.google.protobuf.Duration', - '8': {}, - '10': 'messageRetentionDuration' - }, - { - '1': 'labels', - '3': 9, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Subscription.LabelsEntry', - '8': {}, - '10': 'labels' - }, - { - '1': 'enable_message_ordering', - '3': 10, - '4': 1, - '5': 8, - '8': {}, - '10': 'enableMessageOrdering' - }, - { - '1': 'expiration_policy', - '3': 11, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.ExpirationPolicy', - '8': {}, - '10': 'expirationPolicy' - }, - {'1': 'filter', '3': 12, '4': 1, '5': 9, '8': {}, '10': 'filter'}, - { - '1': 'dead_letter_policy', - '3': 13, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.DeadLetterPolicy', - '8': {}, - '10': 'deadLetterPolicy' - }, - { - '1': 'retry_policy', - '3': 14, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.RetryPolicy', - '8': {}, - '10': 'retryPolicy' - }, - {'1': 'detached', '3': 15, '4': 1, '5': 8, '8': {}, '10': 'detached'}, - { - '1': 'enable_exactly_once_delivery', - '3': 16, - '4': 1, - '5': 8, - '8': {}, - '10': 'enableExactlyOnceDelivery' - }, - { - '1': 'topic_message_retention_duration', - '3': 17, - '4': 1, - '5': 11, - '6': '.google.protobuf.Duration', - '8': {}, - '10': 'topicMessageRetentionDuration' - }, - { - '1': 'state', - '3': 19, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.Subscription.State', - '8': {}, - '10': 'state' - }, - { - '1': 'analytics_hub_subscription_info', - '3': 23, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.Subscription.AnalyticsHubSubscriptionInfo', - '8': {}, - '10': 'analyticsHubSubscriptionInfo' - }, - { - '1': 'message_transforms', - '3': 25, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.MessageTransform', - '8': {}, - '10': 'messageTransforms' - }, - { - '1': 'tags', - '3': 26, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Subscription.TagsEntry', - '8': {}, - '10': 'tags' - }, - ], - '3': [ - Subscription_AnalyticsHubSubscriptionInfo$json, - Subscription_LabelsEntry$json, - Subscription_TagsEntry$json - ], - '4': [Subscription_State$json], - '7': {}, -}; - -@$core.Deprecated('Use subscriptionDescriptor instead') -const Subscription_AnalyticsHubSubscriptionInfo$json = { - '1': 'AnalyticsHubSubscriptionInfo', - '2': [ - {'1': 'listing', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'listing'}, - { - '1': 'subscription', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - ], -}; - -@$core.Deprecated('Use subscriptionDescriptor instead') -const Subscription_LabelsEntry$json = { - '1': 'LabelsEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -@$core.Deprecated('Use subscriptionDescriptor instead') -const Subscription_TagsEntry$json = { - '1': 'TagsEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -@$core.Deprecated('Use subscriptionDescriptor instead') -const Subscription_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'RESOURCE_ERROR', '2': 2}, - ], -}; - -/// Descriptor for `Subscription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List subscriptionDescriptor = $convert.base64Decode( - 'CgxTdWJzY3JpcHRpb24SGgoEbmFtZRgBIAEoCUIG4EEC4EEIUgRuYW1lEjkKBXRvcGljGAIgAS' - 'gJQiPgQQL6QR0KG3B1YnN1Yi5nb29nbGVhcGlzLmNvbS9Ub3BpY1IFdG9waWMSQgoLcHVzaF9j' - 'b25maWcYBCABKAsyHC5nb29nbGUucHVic3ViLnYxLlB1c2hDb25maWdCA+BBAVIKcHVzaENvbm' - 'ZpZxJOCg9iaWdxdWVyeV9jb25maWcYEiABKAsyIC5nb29nbGUucHVic3ViLnYxLkJpZ1F1ZXJ5' - 'Q29uZmlnQgPgQQFSDmJpZ3F1ZXJ5Q29uZmlnElsKFGNsb3VkX3N0b3JhZ2VfY29uZmlnGBYgAS' - 'gLMiQuZ29vZ2xlLnB1YnN1Yi52MS5DbG91ZFN0b3JhZ2VDb25maWdCA+BBAVISY2xvdWRTdG9y' - 'YWdlQ29uZmlnEk4KD2JpZ3RhYmxlX2NvbmZpZxgbIAEoCzIgLmdvb2dsZS5wdWJzdWIudjEuQm' - 'lndGFibGVDb25maWdCA+BBAVIOYmlndGFibGVDb25maWcSNQoUYWNrX2RlYWRsaW5lX3NlY29u' - 'ZHMYBSABKAVCA+BBAVISYWNrRGVhZGxpbmVTZWNvbmRzEjcKFXJldGFpbl9hY2tlZF9tZXNzYW' - 'dlcxgHIAEoCEID4EEBUhNyZXRhaW5BY2tlZE1lc3NhZ2VzElwKGm1lc3NhZ2VfcmV0ZW50aW9u' - 'X2R1cmF0aW9uGAggASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQgPgQQFSGG1lc3NhZ2' - 'VSZXRlbnRpb25EdXJhdGlvbhJHCgZsYWJlbHMYCSADKAsyKi5nb29nbGUucHVic3ViLnYxLlN1' - 'YnNjcmlwdGlvbi5MYWJlbHNFbnRyeUID4EEBUgZsYWJlbHMSOwoXZW5hYmxlX21lc3NhZ2Vfb3' - 'JkZXJpbmcYCiABKAhCA+BBAVIVZW5hYmxlTWVzc2FnZU9yZGVyaW5nElQKEWV4cGlyYXRpb25f' - 'cG9saWN5GAsgASgLMiIuZ29vZ2xlLnB1YnN1Yi52MS5FeHBpcmF0aW9uUG9saWN5QgPgQQFSEG' - 'V4cGlyYXRpb25Qb2xpY3kSGwoGZmlsdGVyGAwgASgJQgPgQQFSBmZpbHRlchJVChJkZWFkX2xl' - 'dHRlcl9wb2xpY3kYDSABKAsyIi5nb29nbGUucHVic3ViLnYxLkRlYWRMZXR0ZXJQb2xpY3lCA+' - 'BBAVIQZGVhZExldHRlclBvbGljeRJFCgxyZXRyeV9wb2xpY3kYDiABKAsyHS5nb29nbGUucHVi' - 'c3ViLnYxLlJldHJ5UG9saWN5QgPgQQFSC3JldHJ5UG9saWN5Eh8KCGRldGFjaGVkGA8gASgIQg' - 'PgQQFSCGRldGFjaGVkEkQKHGVuYWJsZV9leGFjdGx5X29uY2VfZGVsaXZlcnkYECABKAhCA+BB' - 'AVIZZW5hYmxlRXhhY3RseU9uY2VEZWxpdmVyeRJnCiB0b3BpY19tZXNzYWdlX3JldGVudGlvbl' - '9kdXJhdGlvbhgRIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkID4EEDUh10b3BpY01l' - 'c3NhZ2VSZXRlbnRpb25EdXJhdGlvbhI/CgVzdGF0ZRgTIAEoDjIkLmdvb2dsZS5wdWJzdWIudj' - 'EuU3Vic2NyaXB0aW9uLlN0YXRlQgPgQQNSBXN0YXRlEocBCh9hbmFseXRpY3NfaHViX3N1YnNj' - 'cmlwdGlvbl9pbmZvGBcgASgLMjsuZ29vZ2xlLnB1YnN1Yi52MS5TdWJzY3JpcHRpb24uQW5hbH' - 'l0aWNzSHViU3Vic2NyaXB0aW9uSW5mb0ID4EEDUhxhbmFseXRpY3NIdWJTdWJzY3JpcHRpb25J' - 'bmZvElYKEm1lc3NhZ2VfdHJhbnNmb3JtcxgZIAMoCzIiLmdvb2dsZS5wdWJzdWIudjEuTWVzc2' - 'FnZVRyYW5zZm9ybUID4EEBUhFtZXNzYWdlVHJhbnNmb3JtcxJHCgR0YWdzGBogAygLMiguZ29v' - 'Z2xlLnB1YnN1Yi52MS5TdWJzY3JpcHRpb24uVGFnc0VudHJ5QgngQQTgQQXgQQFSBHRhZ3Majg' - 'EKHEFuYWx5dGljc0h1YlN1YnNjcmlwdGlvbkluZm8SRQoHbGlzdGluZxgBIAEoCUIr4EEB+kEl' - 'CiNhbmFseXRpY3NodWIuZ29vZ2xlYXBpcy5jb20vTGlzdGluZ1IHbGlzdGluZxInCgxzdWJzY3' - 'JpcHRpb24YAiABKAlCA+BBAVIMc3Vic2NyaXB0aW9uGjkKC0xhYmVsc0VudHJ5EhAKA2tleRgB' - 'IAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaNwoJVGFnc0VudHJ5EhAKA2tleR' - 'gBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiPgoFU3RhdGUSFQoRU1RBVEVf' - 'VU5TUEVDSUZJRUQQABIKCgZBQ1RJVkUQARISCg5SRVNPVVJDRV9FUlJPUhACOnXqQXIKInB1Yn' - 'N1Yi5nb29nbGVhcGlzLmNvbS9TdWJzY3JpcHRpb24SL3Byb2plY3RzL3twcm9qZWN0fS9zdWJz' - 'Y3JpcHRpb25zL3tzdWJzY3JpcHRpb259Kg1zdWJzY3JpcHRpb25zMgxzdWJzY3JpcHRpb24='); - -@$core.Deprecated('Use retryPolicyDescriptor instead') -const RetryPolicy$json = { - '1': 'RetryPolicy', - '2': [ - { - '1': 'minimum_backoff', - '3': 1, - '4': 1, - '5': 11, - '6': '.google.protobuf.Duration', - '8': {}, - '10': 'minimumBackoff' - }, - { - '1': 'maximum_backoff', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.protobuf.Duration', - '8': {}, - '10': 'maximumBackoff' - }, - ], -}; - -/// Descriptor for `RetryPolicy`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List retryPolicyDescriptor = $convert.base64Decode( - 'CgtSZXRyeVBvbGljeRJHCg9taW5pbXVtX2JhY2tvZmYYASABKAsyGS5nb29nbGUucHJvdG9idW' - 'YuRHVyYXRpb25CA+BBAVIObWluaW11bUJhY2tvZmYSRwoPbWF4aW11bV9iYWNrb2ZmGAIgASgL' - 'MhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uQgPgQQFSDm1heGltdW1CYWNrb2Zm'); - -@$core.Deprecated('Use deadLetterPolicyDescriptor instead') -const DeadLetterPolicy$json = { - '1': 'DeadLetterPolicy', - '2': [ - { - '1': 'dead_letter_topic', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'deadLetterTopic' - }, - { - '1': 'max_delivery_attempts', - '3': 2, - '4': 1, - '5': 5, - '8': {}, - '10': 'maxDeliveryAttempts' - }, - ], -}; - -/// Descriptor for `DeadLetterPolicy`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List deadLetterPolicyDescriptor = $convert.base64Decode( - 'ChBEZWFkTGV0dGVyUG9saWN5Ek8KEWRlYWRfbGV0dGVyX3RvcGljGAEgASgJQiPgQQH6QR0KG3' - 'B1YnN1Yi5nb29nbGVhcGlzLmNvbS9Ub3BpY1IPZGVhZExldHRlclRvcGljEjcKFW1heF9kZWxp' - 'dmVyeV9hdHRlbXB0cxgCIAEoBUID4EEBUhNtYXhEZWxpdmVyeUF0dGVtcHRz'); - -@$core.Deprecated('Use expirationPolicyDescriptor instead') -const ExpirationPolicy$json = { - '1': 'ExpirationPolicy', - '2': [ - { - '1': 'ttl', - '3': 1, - '4': 1, - '5': 11, - '6': '.google.protobuf.Duration', - '8': {}, - '10': 'ttl' - }, - ], -}; - -/// Descriptor for `ExpirationPolicy`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List expirationPolicyDescriptor = $convert.base64Decode( - 'ChBFeHBpcmF0aW9uUG9saWN5EjAKA3R0bBgBIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdG' - 'lvbkID4EEBUgN0dGw='); - -@$core.Deprecated('Use pushConfigDescriptor instead') -const PushConfig$json = { - '1': 'PushConfig', - '2': [ - { - '1': 'push_endpoint', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'pushEndpoint' - }, - { - '1': 'attributes', - '3': 2, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.PushConfig.AttributesEntry', - '8': {}, - '10': 'attributes' - }, - { - '1': 'oidc_token', - '3': 3, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.PushConfig.OidcToken', - '8': {}, - '9': 0, - '10': 'oidcToken' - }, - { - '1': 'pubsub_wrapper', - '3': 4, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.PushConfig.PubsubWrapper', - '8': {}, - '9': 1, - '10': 'pubsubWrapper' - }, - { - '1': 'no_wrapper', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.PushConfig.NoWrapper', - '8': {}, - '9': 1, - '10': 'noWrapper' - }, - ], - '3': [ - PushConfig_OidcToken$json, - PushConfig_PubsubWrapper$json, - PushConfig_NoWrapper$json, - PushConfig_AttributesEntry$json - ], - '8': [ - {'1': 'authentication_method'}, - {'1': 'wrapper'}, - ], -}; - -@$core.Deprecated('Use pushConfigDescriptor instead') -const PushConfig_OidcToken$json = { - '1': 'OidcToken', - '2': [ - { - '1': 'service_account_email', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'serviceAccountEmail' - }, - {'1': 'audience', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'audience'}, - ], -}; - -@$core.Deprecated('Use pushConfigDescriptor instead') -const PushConfig_PubsubWrapper$json = { - '1': 'PubsubWrapper', -}; - -@$core.Deprecated('Use pushConfigDescriptor instead') -const PushConfig_NoWrapper$json = { - '1': 'NoWrapper', - '2': [ - { - '1': 'write_metadata', - '3': 1, - '4': 1, - '5': 8, - '8': {}, - '10': 'writeMetadata' - }, - ], -}; - -@$core.Deprecated('Use pushConfigDescriptor instead') -const PushConfig_AttributesEntry$json = { - '1': 'AttributesEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -/// Descriptor for `PushConfig`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List pushConfigDescriptor = $convert.base64Decode( - 'CgpQdXNoQ29uZmlnEigKDXB1c2hfZW5kcG9pbnQYASABKAlCA+BBAVIMcHVzaEVuZHBvaW50El' - 'EKCmF0dHJpYnV0ZXMYAiADKAsyLC5nb29nbGUucHVic3ViLnYxLlB1c2hDb25maWcuQXR0cmli' - 'dXRlc0VudHJ5QgPgQQFSCmF0dHJpYnV0ZXMSTAoKb2lkY190b2tlbhgDIAEoCzImLmdvb2dsZS' - '5wdWJzdWIudjEuUHVzaENvbmZpZy5PaWRjVG9rZW5CA+BBAUgAUglvaWRjVG9rZW4SWAoOcHVi' - 'c3ViX3dyYXBwZXIYBCABKAsyKi5nb29nbGUucHVic3ViLnYxLlB1c2hDb25maWcuUHVic3ViV3' - 'JhcHBlckID4EEBSAFSDXB1YnN1YldyYXBwZXISTAoKbm9fd3JhcHBlchgFIAEoCzImLmdvb2ds' - 'ZS5wdWJzdWIudjEuUHVzaENvbmZpZy5Ob1dyYXBwZXJCA+BBAUgBUglub1dyYXBwZXIaZQoJT2' - 'lkY1Rva2VuEjcKFXNlcnZpY2VfYWNjb3VudF9lbWFpbBgBIAEoCUID4EEBUhNzZXJ2aWNlQWNj' - 'b3VudEVtYWlsEh8KCGF1ZGllbmNlGAIgASgJQgPgQQFSCGF1ZGllbmNlGg8KDVB1YnN1YldyYX' - 'BwZXIaNwoJTm9XcmFwcGVyEioKDndyaXRlX21ldGFkYXRhGAEgASgIQgPgQQFSDXdyaXRlTWV0' - 'YWRhdGEaPQoPQXR0cmlidXRlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgAS' - 'gJUgV2YWx1ZToCOAFCFwoVYXV0aGVudGljYXRpb25fbWV0aG9kQgkKB3dyYXBwZXI='); - -@$core.Deprecated('Use bigQueryConfigDescriptor instead') -const BigQueryConfig$json = { - '1': 'BigQueryConfig', - '2': [ - {'1': 'table', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'table'}, - { - '1': 'use_topic_schema', - '3': 2, - '4': 1, - '5': 8, - '8': {}, - '10': 'useTopicSchema' - }, - { - '1': 'write_metadata', - '3': 3, - '4': 1, - '5': 8, - '8': {}, - '10': 'writeMetadata' - }, - { - '1': 'drop_unknown_fields', - '3': 4, - '4': 1, - '5': 8, - '8': {}, - '10': 'dropUnknownFields' - }, - { - '1': 'state', - '3': 5, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.BigQueryConfig.State', - '8': {}, - '10': 'state' - }, - { - '1': 'use_table_schema', - '3': 6, - '4': 1, - '5': 8, - '8': {}, - '10': 'useTableSchema' - }, - { - '1': 'service_account_email', - '3': 7, - '4': 1, - '5': 9, - '8': {}, - '10': 'serviceAccountEmail' - }, - ], - '4': [BigQueryConfig_State$json], -}; - -@$core.Deprecated('Use bigQueryConfigDescriptor instead') -const BigQueryConfig_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'PERMISSION_DENIED', '2': 2}, - {'1': 'NOT_FOUND', '2': 3}, - {'1': 'SCHEMA_MISMATCH', '2': 4}, - {'1': 'IN_TRANSIT_LOCATION_RESTRICTION', '2': 5}, - {'1': 'VERTEX_AI_LOCATION_RESTRICTION', '2': 6}, - ], -}; - -/// Descriptor for `BigQueryConfig`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List bigQueryConfigDescriptor = $convert.base64Decode( - 'Cg5CaWdRdWVyeUNvbmZpZxIZCgV0YWJsZRgBIAEoCUID4EEBUgV0YWJsZRItChB1c2VfdG9waW' - 'Nfc2NoZW1hGAIgASgIQgPgQQFSDnVzZVRvcGljU2NoZW1hEioKDndyaXRlX21ldGFkYXRhGAMg' - 'ASgIQgPgQQFSDXdyaXRlTWV0YWRhdGESMwoTZHJvcF91bmtub3duX2ZpZWxkcxgEIAEoCEID4E' - 'EBUhFkcm9wVW5rbm93bkZpZWxkcxJBCgVzdGF0ZRgFIAEoDjImLmdvb2dsZS5wdWJzdWIudjEu' - 'QmlnUXVlcnlDb25maWcuU3RhdGVCA+BBA1IFc3RhdGUSLQoQdXNlX3RhYmxlX3NjaGVtYRgGIA' - 'EoCEID4EEBUg51c2VUYWJsZVNjaGVtYRI3ChVzZXJ2aWNlX2FjY291bnRfZW1haWwYByABKAlC' - 'A+BBAVITc2VydmljZUFjY291bnRFbWFpbCKuAQoFU3RhdGUSFQoRU1RBVEVfVU5TUEVDSUZJRU' - 'QQABIKCgZBQ1RJVkUQARIVChFQRVJNSVNTSU9OX0RFTklFRBACEg0KCU5PVF9GT1VORBADEhMK' - 'D1NDSEVNQV9NSVNNQVRDSBAEEiMKH0lOX1RSQU5TSVRfTE9DQVRJT05fUkVTVFJJQ1RJT04QBR' - 'IiCh5WRVJURVhfQUlfTE9DQVRJT05fUkVTVFJJQ1RJT04QBg=='); - -@$core.Deprecated('Use bigtableConfigDescriptor instead') -const BigtableConfig$json = { - '1': 'BigtableConfig', - '2': [ - {'1': 'table', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'table'}, - { - '1': 'app_profile_id', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'appProfileId' - }, - { - '1': 'service_account_email', - '3': 3, - '4': 1, - '5': 9, - '8': {}, - '10': 'serviceAccountEmail' - }, - { - '1': 'write_metadata', - '3': 5, - '4': 1, - '5': 8, - '8': {}, - '10': 'writeMetadata' - }, - { - '1': 'state', - '3': 4, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.BigtableConfig.State', - '8': {}, - '10': 'state' - }, - ], - '4': [BigtableConfig_State$json], -}; - -@$core.Deprecated('Use bigtableConfigDescriptor instead') -const BigtableConfig_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'NOT_FOUND', '2': 2}, - {'1': 'APP_PROFILE_MISCONFIGURED', '2': 3}, - {'1': 'PERMISSION_DENIED', '2': 4}, - {'1': 'SCHEMA_MISMATCH', '2': 5}, - {'1': 'IN_TRANSIT_LOCATION_RESTRICTION', '2': 6}, - {'1': 'VERTEX_AI_LOCATION_RESTRICTION', '2': 7}, - ], -}; - -/// Descriptor for `BigtableConfig`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List bigtableConfigDescriptor = $convert.base64Decode( - 'Cg5CaWd0YWJsZUNvbmZpZxIZCgV0YWJsZRgBIAEoCUID4EEBUgV0YWJsZRIpCg5hcHBfcHJvZm' - 'lsZV9pZBgCIAEoCUID4EEBUgxhcHBQcm9maWxlSWQSNwoVc2VydmljZV9hY2NvdW50X2VtYWls' - 'GAMgASgJQgPgQQFSE3NlcnZpY2VBY2NvdW50RW1haWwSKgoOd3JpdGVfbWV0YWRhdGEYBSABKA' - 'hCA+BBAVINd3JpdGVNZXRhZGF0YRJBCgVzdGF0ZRgEIAEoDjImLmdvb2dsZS5wdWJzdWIudjEu' - 'QmlndGFibGVDb25maWcuU3RhdGVCA+BBA1IFc3RhdGUizQEKBVN0YXRlEhUKEVNUQVRFX1VOU1' - 'BFQ0lGSUVEEAASCgoGQUNUSVZFEAESDQoJTk9UX0ZPVU5EEAISHQoZQVBQX1BST0ZJTEVfTUlT' - 'Q09ORklHVVJFRBADEhUKEVBFUk1JU1NJT05fREVOSUVEEAQSEwoPU0NIRU1BX01JU01BVENIEA' - 'USIwofSU5fVFJBTlNJVF9MT0NBVElPTl9SRVNUUklDVElPThAGEiIKHlZFUlRFWF9BSV9MT0NB' - 'VElPTl9SRVNUUklDVElPThAH'); - -@$core.Deprecated('Use cloudStorageConfigDescriptor instead') -const CloudStorageConfig$json = { - '1': 'CloudStorageConfig', - '2': [ - {'1': 'bucket', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'bucket'}, - { - '1': 'filename_prefix', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'filenamePrefix' - }, - { - '1': 'filename_suffix', - '3': 3, - '4': 1, - '5': 9, - '8': {}, - '10': 'filenameSuffix' - }, - { - '1': 'filename_datetime_format', - '3': 10, - '4': 1, - '5': 9, - '8': {}, - '10': 'filenameDatetimeFormat' - }, - { - '1': 'text_config', - '3': 4, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.CloudStorageConfig.TextConfig', - '8': {}, - '9': 0, - '10': 'textConfig' - }, - { - '1': 'avro_config', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.CloudStorageConfig.AvroConfig', - '8': {}, - '9': 0, - '10': 'avroConfig' - }, - { - '1': 'max_duration', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.protobuf.Duration', - '8': {}, - '10': 'maxDuration' - }, - {'1': 'max_bytes', '3': 7, '4': 1, '5': 3, '8': {}, '10': 'maxBytes'}, - {'1': 'max_messages', '3': 8, '4': 1, '5': 3, '8': {}, '10': 'maxMessages'}, - { - '1': 'state', - '3': 9, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.CloudStorageConfig.State', - '8': {}, - '10': 'state' - }, - { - '1': 'service_account_email', - '3': 11, - '4': 1, - '5': 9, - '8': {}, - '10': 'serviceAccountEmail' - }, - ], - '3': [CloudStorageConfig_TextConfig$json, CloudStorageConfig_AvroConfig$json], - '4': [CloudStorageConfig_State$json], - '8': [ - {'1': 'output_format'}, - ], -}; - -@$core.Deprecated('Use cloudStorageConfigDescriptor instead') -const CloudStorageConfig_TextConfig$json = { - '1': 'TextConfig', -}; - -@$core.Deprecated('Use cloudStorageConfigDescriptor instead') -const CloudStorageConfig_AvroConfig$json = { - '1': 'AvroConfig', - '2': [ - { - '1': 'write_metadata', - '3': 1, - '4': 1, - '5': 8, - '8': {}, - '10': 'writeMetadata' - }, - { - '1': 'use_topic_schema', - '3': 2, - '4': 1, - '5': 8, - '8': {}, - '10': 'useTopicSchema' - }, - ], -}; - -@$core.Deprecated('Use cloudStorageConfigDescriptor instead') -const CloudStorageConfig_State$json = { - '1': 'State', - '2': [ - {'1': 'STATE_UNSPECIFIED', '2': 0}, - {'1': 'ACTIVE', '2': 1}, - {'1': 'PERMISSION_DENIED', '2': 2}, - {'1': 'NOT_FOUND', '2': 3}, - {'1': 'IN_TRANSIT_LOCATION_RESTRICTION', '2': 4}, - {'1': 'SCHEMA_MISMATCH', '2': 5}, - {'1': 'VERTEX_AI_LOCATION_RESTRICTION', '2': 6}, - ], -}; - -/// Descriptor for `CloudStorageConfig`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List cloudStorageConfigDescriptor = $convert.base64Decode( - 'ChJDbG91ZFN0b3JhZ2VDb25maWcSGwoGYnVja2V0GAEgASgJQgPgQQJSBmJ1Y2tldBIsCg9maW' - 'xlbmFtZV9wcmVmaXgYAiABKAlCA+BBAVIOZmlsZW5hbWVQcmVmaXgSLAoPZmlsZW5hbWVfc3Vm' - 'Zml4GAMgASgJQgPgQQFSDmZpbGVuYW1lU3VmZml4Ej0KGGZpbGVuYW1lX2RhdGV0aW1lX2Zvcm' - '1hdBgKIAEoCUID4EEBUhZmaWxlbmFtZURhdGV0aW1lRm9ybWF0ElcKC3RleHRfY29uZmlnGAQg' - 'ASgLMi8uZ29vZ2xlLnB1YnN1Yi52MS5DbG91ZFN0b3JhZ2VDb25maWcuVGV4dENvbmZpZ0ID4E' - 'EBSABSCnRleHRDb25maWcSVwoLYXZyb19jb25maWcYBSABKAsyLy5nb29nbGUucHVic3ViLnYx' - 'LkNsb3VkU3RvcmFnZUNvbmZpZy5BdnJvQ29uZmlnQgPgQQFIAFIKYXZyb0NvbmZpZxJBCgxtYX' - 'hfZHVyYXRpb24YBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CA+BBAVILbWF4RHVy' - 'YXRpb24SIAoJbWF4X2J5dGVzGAcgASgDQgPgQQFSCG1heEJ5dGVzEiYKDG1heF9tZXNzYWdlcx' - 'gIIAEoA0ID4EEBUgttYXhNZXNzYWdlcxJFCgVzdGF0ZRgJIAEoDjIqLmdvb2dsZS5wdWJzdWIu' - 'djEuQ2xvdWRTdG9yYWdlQ29uZmlnLlN0YXRlQgPgQQNSBXN0YXRlEjcKFXNlcnZpY2VfYWNjb3' - 'VudF9lbWFpbBgLIAEoCUID4EEBUhNzZXJ2aWNlQWNjb3VudEVtYWlsGgwKClRleHRDb25maWca' - 'ZwoKQXZyb0NvbmZpZxIqCg53cml0ZV9tZXRhZGF0YRgBIAEoCEID4EEBUg13cml0ZU1ldGFkYX' - 'RhEi0KEHVzZV90b3BpY19zY2hlbWEYAiABKAhCA+BBAVIOdXNlVG9waWNTY2hlbWEirgEKBVN0' - 'YXRlEhUKEVNUQVRFX1VOU1BFQ0lGSUVEEAASCgoGQUNUSVZFEAESFQoRUEVSTUlTU0lPTl9ERU' - '5JRUQQAhINCglOT1RfRk9VTkQQAxIjCh9JTl9UUkFOU0lUX0xPQ0FUSU9OX1JFU1RSSUNUSU9O' - 'EAQSEwoPU0NIRU1BX01JU01BVENIEAUSIgoeVkVSVEVYX0FJX0xPQ0FUSU9OX1JFU1RSSUNUSU' - '9OEAZCDwoNb3V0cHV0X2Zvcm1hdA=='); - -@$core.Deprecated('Use receivedMessageDescriptor instead') -const ReceivedMessage$json = { - '1': 'ReceivedMessage', - '2': [ - {'1': 'ack_id', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'ackId'}, - { - '1': 'message', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.PubsubMessage', - '8': {}, - '10': 'message' - }, - { - '1': 'delivery_attempt', - '3': 3, - '4': 1, - '5': 5, - '8': {}, - '10': 'deliveryAttempt' - }, - ], -}; - -/// Descriptor for `ReceivedMessage`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List receivedMessageDescriptor = $convert.base64Decode( - 'Cg9SZWNlaXZlZE1lc3NhZ2USGgoGYWNrX2lkGAEgASgJQgPgQQFSBWFja0lkEj4KB21lc3NhZ2' - 'UYAiABKAsyHy5nb29nbGUucHVic3ViLnYxLlB1YnN1Yk1lc3NhZ2VCA+BBAVIHbWVzc2FnZRIu' - 'ChBkZWxpdmVyeV9hdHRlbXB0GAMgASgFQgPgQQFSD2RlbGl2ZXJ5QXR0ZW1wdA=='); - -@$core.Deprecated('Use getSubscriptionRequestDescriptor instead') -const GetSubscriptionRequest$json = { - '1': 'GetSubscriptionRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - ], -}; - -/// Descriptor for `GetSubscriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List getSubscriptionRequestDescriptor = - $convert.base64Decode( - 'ChZHZXRTdWJzY3JpcHRpb25SZXF1ZXN0Ek4KDHN1YnNjcmlwdGlvbhgBIAEoCUIq4EEC+kEkCi' - 'JwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU3Vic2NyaXB0aW9uUgxzdWJzY3JpcHRpb24='); - -@$core.Deprecated('Use updateSubscriptionRequestDescriptor instead') -const UpdateSubscriptionRequest$json = { - '1': 'UpdateSubscriptionRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.Subscription', - '8': {}, - '10': 'subscription' - }, - { - '1': 'update_mask', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.protobuf.FieldMask', - '8': {}, - '10': 'updateMask' - }, - ], -}; - -/// Descriptor for `UpdateSubscriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List updateSubscriptionRequestDescriptor = $convert.base64Decode( - 'ChlVcGRhdGVTdWJzY3JpcHRpb25SZXF1ZXN0EkcKDHN1YnNjcmlwdGlvbhgBIAEoCzIeLmdvb2' - 'dsZS5wdWJzdWIudjEuU3Vic2NyaXB0aW9uQgPgQQJSDHN1YnNjcmlwdGlvbhJACgt1cGRhdGVf' - 'bWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBAlIKdXBkYXRlTWFzaw' - '=='); - -@$core.Deprecated('Use listSubscriptionsRequestDescriptor instead') -const ListSubscriptionsRequest$json = { - '1': 'ListSubscriptionsRequest', - '2': [ - {'1': 'project', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'project'}, - {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, - {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, - ], -}; - -/// Descriptor for `ListSubscriptionsRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listSubscriptionsRequestDescriptor = $convert.base64Decode( - 'ChhMaXN0U3Vic2NyaXB0aW9uc1JlcXVlc3QSTQoHcHJvamVjdBgBIAEoCUIz4EEC+kEtCitjbG' - '91ZHJlc291cmNlbWFuYWdlci5nb29nbGVhcGlzLmNvbS9Qcm9qZWN0Ugdwcm9qZWN0EiAKCXBh' - 'Z2Vfc2l6ZRgCIAEoBUID4EEBUghwYWdlU2l6ZRIiCgpwYWdlX3Rva2VuGAMgASgJQgPgQQFSCX' - 'BhZ2VUb2tlbg=='); - -@$core.Deprecated('Use listSubscriptionsResponseDescriptor instead') -const ListSubscriptionsResponse$json = { - '1': 'ListSubscriptionsResponse', - '2': [ - { - '1': 'subscriptions', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Subscription', - '8': {}, - '10': 'subscriptions' - }, - { - '1': 'next_page_token', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'nextPageToken' - }, - ], -}; - -/// Descriptor for `ListSubscriptionsResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listSubscriptionsResponseDescriptor = $convert.base64Decode( - 'ChlMaXN0U3Vic2NyaXB0aW9uc1Jlc3BvbnNlEkkKDXN1YnNjcmlwdGlvbnMYASADKAsyHi5nb2' - '9nbGUucHVic3ViLnYxLlN1YnNjcmlwdGlvbkID4EEBUg1zdWJzY3JpcHRpb25zEisKD25leHRf' - 'cGFnZV90b2tlbhgCIAEoCUID4EEBUg1uZXh0UGFnZVRva2Vu'); - -@$core.Deprecated('Use deleteSubscriptionRequestDescriptor instead') -const DeleteSubscriptionRequest$json = { - '1': 'DeleteSubscriptionRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - ], -}; - -/// Descriptor for `DeleteSubscriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List deleteSubscriptionRequestDescriptor = - $convert.base64Decode( - 'ChlEZWxldGVTdWJzY3JpcHRpb25SZXF1ZXN0Ek4KDHN1YnNjcmlwdGlvbhgBIAEoCUIq4EEC+k' - 'EkCiJwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU3Vic2NyaXB0aW9uUgxzdWJzY3JpcHRpb24='); - -@$core.Deprecated('Use modifyPushConfigRequestDescriptor instead') -const ModifyPushConfigRequest$json = { - '1': 'ModifyPushConfigRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - { - '1': 'push_config', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.PushConfig', - '8': {}, - '10': 'pushConfig' - }, - ], -}; - -/// Descriptor for `ModifyPushConfigRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List modifyPushConfigRequestDescriptor = $convert.base64Decode( - 'ChdNb2RpZnlQdXNoQ29uZmlnUmVxdWVzdBJOCgxzdWJzY3JpcHRpb24YASABKAlCKuBBAvpBJA' - 'oicHVic3ViLmdvb2dsZWFwaXMuY29tL1N1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uEkIKC3B1' - 'c2hfY29uZmlnGAIgASgLMhwuZ29vZ2xlLnB1YnN1Yi52MS5QdXNoQ29uZmlnQgPgQQJSCnB1c2' - 'hDb25maWc='); - -@$core.Deprecated('Use pullRequestDescriptor instead') -const PullRequest$json = { - '1': 'PullRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - { - '1': 'return_immediately', - '3': 2, - '4': 1, - '5': 8, - '8': {'3': true}, - '10': 'returnImmediately', - }, - {'1': 'max_messages', '3': 3, '4': 1, '5': 5, '8': {}, '10': 'maxMessages'}, - ], -}; - -/// Descriptor for `PullRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List pullRequestDescriptor = $convert.base64Decode( - 'CgtQdWxsUmVxdWVzdBJOCgxzdWJzY3JpcHRpb24YASABKAlCKuBBAvpBJAoicHVic3ViLmdvb2' - 'dsZWFwaXMuY29tL1N1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uEjQKEnJldHVybl9pbW1lZGlh' - 'dGVseRgCIAEoCEIFGAHgQQFSEXJldHVybkltbWVkaWF0ZWx5EiYKDG1heF9tZXNzYWdlcxgDIA' - 'EoBUID4EECUgttYXhNZXNzYWdlcw=='); - -@$core.Deprecated('Use pullResponseDescriptor instead') -const PullResponse$json = { - '1': 'PullResponse', - '2': [ - { - '1': 'received_messages', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.ReceivedMessage', - '8': {}, - '10': 'receivedMessages' - }, - ], -}; - -/// Descriptor for `PullResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List pullResponseDescriptor = $convert.base64Decode( - 'CgxQdWxsUmVzcG9uc2USUwoRcmVjZWl2ZWRfbWVzc2FnZXMYASADKAsyIS5nb29nbGUucHVic3' - 'ViLnYxLlJlY2VpdmVkTWVzc2FnZUID4EEBUhByZWNlaXZlZE1lc3NhZ2Vz'); - -@$core.Deprecated('Use modifyAckDeadlineRequestDescriptor instead') -const ModifyAckDeadlineRequest$json = { - '1': 'ModifyAckDeadlineRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - {'1': 'ack_ids', '3': 4, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, - { - '1': 'ack_deadline_seconds', - '3': 3, - '4': 1, - '5': 5, - '8': {}, - '10': 'ackDeadlineSeconds' - }, - ], -}; - -/// Descriptor for `ModifyAckDeadlineRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List modifyAckDeadlineRequestDescriptor = $convert.base64Decode( - 'ChhNb2RpZnlBY2tEZWFkbGluZVJlcXVlc3QSTgoMc3Vic2NyaXB0aW9uGAEgASgJQirgQQL6QS' - 'QKInB1YnN1Yi5nb29nbGVhcGlzLmNvbS9TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbhIcCgdh' - 'Y2tfaWRzGAQgAygJQgPgQQJSBmFja0lkcxI1ChRhY2tfZGVhZGxpbmVfc2Vjb25kcxgDIAEoBU' - 'ID4EECUhJhY2tEZWFkbGluZVNlY29uZHM='); - -@$core.Deprecated('Use acknowledgeRequestDescriptor instead') -const AcknowledgeRequest$json = { - '1': 'AcknowledgeRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - {'1': 'ack_ids', '3': 2, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, - ], -}; - -/// Descriptor for `AcknowledgeRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List acknowledgeRequestDescriptor = $convert.base64Decode( - 'ChJBY2tub3dsZWRnZVJlcXVlc3QSTgoMc3Vic2NyaXB0aW9uGAEgASgJQirgQQL6QSQKInB1Yn' - 'N1Yi5nb29nbGVhcGlzLmNvbS9TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbhIcCgdhY2tfaWRz' - 'GAIgAygJQgPgQQJSBmFja0lkcw=='); - -@$core.Deprecated('Use streamingPullRequestDescriptor instead') -const StreamingPullRequest$json = { - '1': 'StreamingPullRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - {'1': 'ack_ids', '3': 2, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, - { - '1': 'modify_deadline_seconds', - '3': 3, - '4': 3, - '5': 5, - '8': {}, - '10': 'modifyDeadlineSeconds' - }, - { - '1': 'modify_deadline_ack_ids', - '3': 4, - '4': 3, - '5': 9, - '8': {}, - '10': 'modifyDeadlineAckIds' - }, - { - '1': 'stream_ack_deadline_seconds', - '3': 5, - '4': 1, - '5': 5, - '8': {}, - '10': 'streamAckDeadlineSeconds' - }, - {'1': 'client_id', '3': 6, '4': 1, '5': 9, '8': {}, '10': 'clientId'}, - { - '1': 'max_outstanding_messages', - '3': 7, - '4': 1, - '5': 3, - '8': {}, - '10': 'maxOutstandingMessages' - }, - { - '1': 'max_outstanding_bytes', - '3': 8, - '4': 1, - '5': 3, - '8': {}, - '10': 'maxOutstandingBytes' - }, - { - '1': 'protocol_version', - '3': 10, - '4': 1, - '5': 3, - '8': {}, - '10': 'protocolVersion' - }, - ], -}; - -/// Descriptor for `StreamingPullRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List streamingPullRequestDescriptor = $convert.base64Decode( - 'ChRTdHJlYW1pbmdQdWxsUmVxdWVzdBJOCgxzdWJzY3JpcHRpb24YASABKAlCKuBBAvpBJAoicH' - 'Vic3ViLmdvb2dsZWFwaXMuY29tL1N1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uEhwKB2Fja19p' - 'ZHMYAiADKAlCA+BBAVIGYWNrSWRzEjsKF21vZGlmeV9kZWFkbGluZV9zZWNvbmRzGAMgAygFQg' - 'PgQQFSFW1vZGlmeURlYWRsaW5lU2Vjb25kcxI6Chdtb2RpZnlfZGVhZGxpbmVfYWNrX2lkcxgE' - 'IAMoCUID4EEBUhRtb2RpZnlEZWFkbGluZUFja0lkcxJCChtzdHJlYW1fYWNrX2RlYWRsaW5lX3' - 'NlY29uZHMYBSABKAVCA+BBAlIYc3RyZWFtQWNrRGVhZGxpbmVTZWNvbmRzEiAKCWNsaWVudF9p' - 'ZBgGIAEoCUID4EEBUghjbGllbnRJZBI9ChhtYXhfb3V0c3RhbmRpbmdfbWVzc2FnZXMYByABKA' - 'NCA+BBAVIWbWF4T3V0c3RhbmRpbmdNZXNzYWdlcxI3ChVtYXhfb3V0c3RhbmRpbmdfYnl0ZXMY' - 'CCABKANCA+BBAVITbWF4T3V0c3RhbmRpbmdCeXRlcxIuChBwcm90b2NvbF92ZXJzaW9uGAogAS' - 'gDQgPgQQFSD3Byb3RvY29sVmVyc2lvbg=='); - -@$core.Deprecated('Use streamingPullResponseDescriptor instead') -const StreamingPullResponse$json = { - '1': 'StreamingPullResponse', - '2': [ - { - '1': 'received_messages', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.ReceivedMessage', - '8': {}, - '10': 'receivedMessages' - }, - { - '1': 'acknowledge_confirmation', - '3': 5, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.StreamingPullResponse.AcknowledgeConfirmation', - '8': {}, - '10': 'acknowledgeConfirmation' - }, - { - '1': 'modify_ack_deadline_confirmation', - '3': 3, - '4': 1, - '5': 11, - '6': - '.google.pubsub.v1.StreamingPullResponse.ModifyAckDeadlineConfirmation', - '8': {}, - '10': 'modifyAckDeadlineConfirmation' - }, - { - '1': 'subscription_properties', - '3': 4, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.StreamingPullResponse.SubscriptionProperties', - '8': {}, - '10': 'subscriptionProperties' - }, - ], - '3': [ - StreamingPullResponse_AcknowledgeConfirmation$json, - StreamingPullResponse_ModifyAckDeadlineConfirmation$json, - StreamingPullResponse_SubscriptionProperties$json - ], -}; - -@$core.Deprecated('Use streamingPullResponseDescriptor instead') -const StreamingPullResponse_AcknowledgeConfirmation$json = { - '1': 'AcknowledgeConfirmation', - '2': [ - {'1': 'ack_ids', '3': 1, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, - { - '1': 'invalid_ack_ids', - '3': 2, - '4': 3, - '5': 9, - '8': {}, - '10': 'invalidAckIds' - }, - { - '1': 'unordered_ack_ids', - '3': 3, - '4': 3, - '5': 9, - '8': {}, - '10': 'unorderedAckIds' - }, - { - '1': 'temporary_failed_ack_ids', - '3': 4, - '4': 3, - '5': 9, - '8': {}, - '10': 'temporaryFailedAckIds' - }, - ], -}; - -@$core.Deprecated('Use streamingPullResponseDescriptor instead') -const StreamingPullResponse_ModifyAckDeadlineConfirmation$json = { - '1': 'ModifyAckDeadlineConfirmation', - '2': [ - {'1': 'ack_ids', '3': 1, '4': 3, '5': 9, '8': {}, '10': 'ackIds'}, - { - '1': 'invalid_ack_ids', - '3': 2, - '4': 3, - '5': 9, - '8': {}, - '10': 'invalidAckIds' - }, - { - '1': 'temporary_failed_ack_ids', - '3': 3, - '4': 3, - '5': 9, - '8': {}, - '10': 'temporaryFailedAckIds' - }, - ], -}; - -@$core.Deprecated('Use streamingPullResponseDescriptor instead') -const StreamingPullResponse_SubscriptionProperties$json = { - '1': 'SubscriptionProperties', - '2': [ - { - '1': 'exactly_once_delivery_enabled', - '3': 1, - '4': 1, - '5': 8, - '8': {}, - '10': 'exactlyOnceDeliveryEnabled' - }, - { - '1': 'message_ordering_enabled', - '3': 2, - '4': 1, - '5': 8, - '8': {}, - '10': 'messageOrderingEnabled' - }, - ], -}; - -/// Descriptor for `StreamingPullResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List streamingPullResponseDescriptor = $convert.base64Decode( - 'ChVTdHJlYW1pbmdQdWxsUmVzcG9uc2USUwoRcmVjZWl2ZWRfbWVzc2FnZXMYASADKAsyIS5nb2' - '9nbGUucHVic3ViLnYxLlJlY2VpdmVkTWVzc2FnZUID4EEBUhByZWNlaXZlZE1lc3NhZ2VzEn8K' - 'GGFja25vd2xlZGdlX2NvbmZpcm1hdGlvbhgFIAEoCzI/Lmdvb2dsZS5wdWJzdWIudjEuU3RyZW' - 'FtaW5nUHVsbFJlc3BvbnNlLkFja25vd2xlZGdlQ29uZmlybWF0aW9uQgPgQQFSF2Fja25vd2xl' - 'ZGdlQ29uZmlybWF0aW9uEpMBCiBtb2RpZnlfYWNrX2RlYWRsaW5lX2NvbmZpcm1hdGlvbhgDIA' - 'EoCzJFLmdvb2dsZS5wdWJzdWIudjEuU3RyZWFtaW5nUHVsbFJlc3BvbnNlLk1vZGlmeUFja0Rl' - 'YWRsaW5lQ29uZmlybWF0aW9uQgPgQQFSHW1vZGlmeUFja0RlYWRsaW5lQ29uZmlybWF0aW9uEn' - 'wKF3N1YnNjcmlwdGlvbl9wcm9wZXJ0aWVzGAQgASgLMj4uZ29vZ2xlLnB1YnN1Yi52MS5TdHJl' - 'YW1pbmdQdWxsUmVzcG9uc2UuU3Vic2NyaXB0aW9uUHJvcGVydGllc0ID4EEBUhZzdWJzY3JpcH' - 'Rpb25Qcm9wZXJ0aWVzGtMBChdBY2tub3dsZWRnZUNvbmZpcm1hdGlvbhIcCgdhY2tfaWRzGAEg' - 'AygJQgPgQQFSBmFja0lkcxIrCg9pbnZhbGlkX2Fja19pZHMYAiADKAlCA+BBAVINaW52YWxpZE' - 'Fja0lkcxIvChF1bm9yZGVyZWRfYWNrX2lkcxgDIAMoCUID4EEBUg91bm9yZGVyZWRBY2tJZHMS' - 'PAoYdGVtcG9yYXJ5X2ZhaWxlZF9hY2tfaWRzGAQgAygJQgPgQQFSFXRlbXBvcmFyeUZhaWxlZE' - 'Fja0lkcxqoAQodTW9kaWZ5QWNrRGVhZGxpbmVDb25maXJtYXRpb24SHAoHYWNrX2lkcxgBIAMo' - 'CUID4EEBUgZhY2tJZHMSKwoPaW52YWxpZF9hY2tfaWRzGAIgAygJQgPgQQFSDWludmFsaWRBY2' - 'tJZHMSPAoYdGVtcG9yYXJ5X2ZhaWxlZF9hY2tfaWRzGAMgAygJQgPgQQFSFXRlbXBvcmFyeUZh' - 'aWxlZEFja0lkcxqfAQoWU3Vic2NyaXB0aW9uUHJvcGVydGllcxJGCh1leGFjdGx5X29uY2VfZG' - 'VsaXZlcnlfZW5hYmxlZBgBIAEoCEID4EEBUhpleGFjdGx5T25jZURlbGl2ZXJ5RW5hYmxlZBI9' - 'ChhtZXNzYWdlX29yZGVyaW5nX2VuYWJsZWQYAiABKAhCA+BBAVIWbWVzc2FnZU9yZGVyaW5nRW' - '5hYmxlZA=='); - -@$core.Deprecated('Use createSnapshotRequestDescriptor instead') -const CreateSnapshotRequest$json = { - '1': 'CreateSnapshotRequest', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - { - '1': 'subscription', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - { - '1': 'labels', - '3': 3, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.CreateSnapshotRequest.LabelsEntry', - '8': {}, - '10': 'labels' - }, - { - '1': 'tags', - '3': 4, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.CreateSnapshotRequest.TagsEntry', - '8': {}, - '10': 'tags' - }, - ], - '3': [ - CreateSnapshotRequest_LabelsEntry$json, - CreateSnapshotRequest_TagsEntry$json - ], -}; - -@$core.Deprecated('Use createSnapshotRequestDescriptor instead') -const CreateSnapshotRequest_LabelsEntry$json = { - '1': 'LabelsEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -@$core.Deprecated('Use createSnapshotRequestDescriptor instead') -const CreateSnapshotRequest_TagsEntry$json = { - '1': 'TagsEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -/// Descriptor for `CreateSnapshotRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List createSnapshotRequestDescriptor = $convert.base64Decode( - 'ChVDcmVhdGVTbmFwc2hvdFJlcXVlc3QSOgoEbmFtZRgBIAEoCUIm4EEC+kEgCh5wdWJzdWIuZ2' - '9vZ2xlYXBpcy5jb20vU25hcHNob3RSBG5hbWUSTgoMc3Vic2NyaXB0aW9uGAIgASgJQirgQQL6' - 'QSQKInB1YnN1Yi5nb29nbGVhcGlzLmNvbS9TdWJzY3JpcHRpb25SDHN1YnNjcmlwdGlvbhJQCg' - 'ZsYWJlbHMYAyADKAsyMy5nb29nbGUucHVic3ViLnYxLkNyZWF0ZVNuYXBzaG90UmVxdWVzdC5M' - 'YWJlbHNFbnRyeUID4EEBUgZsYWJlbHMSUAoEdGFncxgEIAMoCzIxLmdvb2dsZS5wdWJzdWIudj' - 'EuQ3JlYXRlU25hcHNob3RSZXF1ZXN0LlRhZ3NFbnRyeUIJ4EEE4EEF4EEBUgR0YWdzGjkKC0xh' - 'YmVsc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEaNw' - 'oJVGFnc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE='); - -@$core.Deprecated('Use updateSnapshotRequestDescriptor instead') -const UpdateSnapshotRequest$json = { - '1': 'UpdateSnapshotRequest', - '2': [ - { - '1': 'snapshot', - '3': 1, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.Snapshot', - '8': {}, - '10': 'snapshot' - }, - { - '1': 'update_mask', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.protobuf.FieldMask', - '8': {}, - '10': 'updateMask' - }, - ], -}; - -/// Descriptor for `UpdateSnapshotRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List updateSnapshotRequestDescriptor = $convert.base64Decode( - 'ChVVcGRhdGVTbmFwc2hvdFJlcXVlc3QSOwoIc25hcHNob3QYASABKAsyGi5nb29nbGUucHVic3' - 'ViLnYxLlNuYXBzaG90QgPgQQJSCHNuYXBzaG90EkAKC3VwZGF0ZV9tYXNrGAIgASgLMhouZ29v' - 'Z2xlLnByb3RvYnVmLkZpZWxkTWFza0ID4EECUgp1cGRhdGVNYXNr'); - -@$core.Deprecated('Use snapshotDescriptor instead') -const Snapshot$json = { - '1': 'Snapshot', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - {'1': 'topic', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'topic'}, - { - '1': 'expire_time', - '3': 3, - '4': 1, - '5': 11, - '6': '.google.protobuf.Timestamp', - '8': {}, - '10': 'expireTime' - }, - { - '1': 'labels', - '3': 4, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Snapshot.LabelsEntry', - '8': {}, - '10': 'labels' - }, - ], - '3': [Snapshot_LabelsEntry$json], - '7': {}, -}; - -@$core.Deprecated('Use snapshotDescriptor instead') -const Snapshot_LabelsEntry$json = { - '1': 'LabelsEntry', - '2': [ - {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, - {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, - ], - '7': {'7': true}, -}; - -/// Descriptor for `Snapshot`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List snapshotDescriptor = $convert.base64Decode( - 'CghTbmFwc2hvdBIXCgRuYW1lGAEgASgJQgPgQQFSBG5hbWUSOQoFdG9waWMYAiABKAlCI+BBAf' - 'pBHQobcHVic3ViLmdvb2dsZWFwaXMuY29tL1RvcGljUgV0b3BpYxJACgtleHBpcmVfdGltZRgD' - 'IAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAVIKZXhwaXJlVGltZRJDCgZsYW' - 'JlbHMYBCADKAsyJi5nb29nbGUucHVic3ViLnYxLlNuYXBzaG90LkxhYmVsc0VudHJ5QgPgQQFS' - 'BmxhYmVscxo5CgtMYWJlbHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCV' - 'IFdmFsdWU6AjgBOmHqQV4KHnB1YnN1Yi5nb29nbGVhcGlzLmNvbS9TbmFwc2hvdBIncHJvamVj' - 'dHMve3Byb2plY3R9L3NuYXBzaG90cy97c25hcHNob3R9KglzbmFwc2hvdHMyCHNuYXBzaG90'); - -@$core.Deprecated('Use getSnapshotRequestDescriptor instead') -const GetSnapshotRequest$json = { - '1': 'GetSnapshotRequest', - '2': [ - {'1': 'snapshot', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'snapshot'}, - ], -}; - -/// Descriptor for `GetSnapshotRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List getSnapshotRequestDescriptor = $convert.base64Decode( - 'ChJHZXRTbmFwc2hvdFJlcXVlc3QSQgoIc25hcHNob3QYASABKAlCJuBBAvpBIAoecHVic3ViLm' - 'dvb2dsZWFwaXMuY29tL1NuYXBzaG90UghzbmFwc2hvdA=='); - -@$core.Deprecated('Use listSnapshotsRequestDescriptor instead') -const ListSnapshotsRequest$json = { - '1': 'ListSnapshotsRequest', - '2': [ - {'1': 'project', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'project'}, - {'1': 'page_size', '3': 2, '4': 1, '5': 5, '8': {}, '10': 'pageSize'}, - {'1': 'page_token', '3': 3, '4': 1, '5': 9, '8': {}, '10': 'pageToken'}, - ], -}; - -/// Descriptor for `ListSnapshotsRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listSnapshotsRequestDescriptor = $convert.base64Decode( - 'ChRMaXN0U25hcHNob3RzUmVxdWVzdBJNCgdwcm9qZWN0GAEgASgJQjPgQQL6QS0KK2Nsb3Vkcm' - 'Vzb3VyY2VtYW5hZ2VyLmdvb2dsZWFwaXMuY29tL1Byb2plY3RSB3Byb2plY3QSIAoJcGFnZV9z' - 'aXplGAIgASgFQgPgQQFSCHBhZ2VTaXplEiIKCnBhZ2VfdG9rZW4YAyABKAlCA+BBAVIJcGFnZV' - 'Rva2Vu'); - -@$core.Deprecated('Use listSnapshotsResponseDescriptor instead') -const ListSnapshotsResponse$json = { - '1': 'ListSnapshotsResponse', - '2': [ - { - '1': 'snapshots', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Snapshot', - '8': {}, - '10': 'snapshots' - }, - { - '1': 'next_page_token', - '3': 2, - '4': 1, - '5': 9, - '8': {}, - '10': 'nextPageToken' - }, - ], -}; - -/// Descriptor for `ListSnapshotsResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listSnapshotsResponseDescriptor = $convert.base64Decode( - 'ChVMaXN0U25hcHNob3RzUmVzcG9uc2USPQoJc25hcHNob3RzGAEgAygLMhouZ29vZ2xlLnB1Yn' - 'N1Yi52MS5TbmFwc2hvdEID4EEBUglzbmFwc2hvdHMSKwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJ' - 'QgPgQQFSDW5leHRQYWdlVG9rZW4='); - -@$core.Deprecated('Use deleteSnapshotRequestDescriptor instead') -const DeleteSnapshotRequest$json = { - '1': 'DeleteSnapshotRequest', - '2': [ - {'1': 'snapshot', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'snapshot'}, - ], -}; - -/// Descriptor for `DeleteSnapshotRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List deleteSnapshotRequestDescriptor = $convert.base64Decode( - 'ChVEZWxldGVTbmFwc2hvdFJlcXVlc3QSQgoIc25hcHNob3QYASABKAlCJuBBAvpBIAoecHVic3' - 'ViLmdvb2dsZWFwaXMuY29tL1NuYXBzaG90UghzbmFwc2hvdA=='); - -@$core.Deprecated('Use seekRequestDescriptor instead') -const SeekRequest$json = { - '1': 'SeekRequest', - '2': [ - { - '1': 'subscription', - '3': 1, - '4': 1, - '5': 9, - '8': {}, - '10': 'subscription' - }, - { - '1': 'time', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.protobuf.Timestamp', - '8': {}, - '9': 0, - '10': 'time' - }, - { - '1': 'snapshot', - '3': 3, - '4': 1, - '5': 9, - '8': {}, - '9': 0, - '10': 'snapshot' - }, - ], - '8': [ - {'1': 'target'}, - ], -}; - -/// Descriptor for `SeekRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List seekRequestDescriptor = $convert.base64Decode( - 'CgtTZWVrUmVxdWVzdBJOCgxzdWJzY3JpcHRpb24YASABKAlCKuBBAvpBJAoicHVic3ViLmdvb2' - 'dsZWFwaXMuY29tL1N1YnNjcmlwdGlvblIMc3Vic2NyaXB0aW9uEjUKBHRpbWUYAiABKAsyGi5n' - 'b29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQFIAFIEdGltZRJECghzbmFwc2hvdBgDIAEoCU' - 'Im4EEB+kEgCh5wdWJzdWIuZ29vZ2xlYXBpcy5jb20vU25hcHNob3RIAFIIc25hcHNob3RCCAoG' - 'dGFyZ2V0'); - -@$core.Deprecated('Use seekResponseDescriptor instead') -const SeekResponse$json = { - '1': 'SeekResponse', -}; - -/// Descriptor for `SeekResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List seekResponseDescriptor = - $convert.base64Decode('CgxTZWVrUmVzcG9uc2U='); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pb.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pb.dart index 7a8766dd..b921cba9 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pb.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pb.dart @@ -1,19 +1,20 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/pubsub/v1/schema.proto -// +// Generated from google/pubsub/v1/schema.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; -import '../../protobuf/timestamp.pb.dart' as $3; +import '../../protobuf/timestamp.pb.dart' as $2; import 'schema.pbenum.dart'; export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; @@ -27,33 +28,26 @@ class Schema extends $pb.GeneratedMessage { Schema_Type? type, $core.String? definition, $core.String? revisionId, - $3.Timestamp? revisionCreateTime, + $2.Timestamp? revisionCreateTime, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (type != null) { - $result.type = type; - } - if (definition != null) { - $result.definition = definition; - } - if (revisionId != null) { - $result.revisionId = revisionId; - } - if (revisionCreateTime != null) { - $result.revisionCreateTime = revisionCreateTime; - } - return $result; + final result = create(); + if (name != null) result.name = name; + if (type != null) result.type = type; + if (definition != null) result.definition = definition; + if (revisionId != null) result.revisionId = revisionId; + if (revisionCreateTime != null) + result.revisionCreateTime = revisionCreateTime; + return result; } - Schema._() : super(); - factory Schema.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Schema.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + Schema._(); + + factory Schema.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Schema.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'Schema', @@ -67,8 +61,8 @@ class Schema extends $pb.GeneratedMessage { enumValues: Schema_Type.values) ..aOS(3, _omitFieldNames ? '' : 'definition') ..aOS(4, _omitFieldNames ? '' : 'revisionId') - ..aOM<$3.Timestamp>(6, _omitFieldNames ? '' : 'revisionCreateTime', - subBuilder: $3.Timestamp.create) + ..aOM<$2.Timestamp>(6, _omitFieldNames ? '' : 'revisionCreateTime', + subBuilder: $2.Timestamp.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -77,10 +71,12 @@ class Schema extends $pb.GeneratedMessage { Schema copyWith(void Function(Schema) updates) => super.copyWith((message) => updates(message as Schema)) as Schema; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Schema create() => Schema._(); + @$core.override Schema createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') @@ -93,10 +89,7 @@ class Schema extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -106,10 +99,7 @@ class Schema extends $pb.GeneratedMessage { @$pb.TagNumber(2) Schema_Type get type => $_getN(1); @$pb.TagNumber(2) - set type(Schema_Type v) { - $_setField(2, v); - } - + set type(Schema_Type value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasType() => $_has(1); @$pb.TagNumber(2) @@ -121,10 +111,7 @@ class Schema extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get definition => $_getSZ(2); @$pb.TagNumber(3) - set definition($core.String v) { - $_setString(2, v); - } - + set definition($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasDefinition() => $_has(2); @$pb.TagNumber(3) @@ -134,10 +121,7 @@ class Schema extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get revisionId => $_getSZ(3); @$pb.TagNumber(4) - set revisionId($core.String v) { - $_setString(3, v); - } - + set revisionId($core.String value) => $_setString(3, value); @$pb.TagNumber(4) $core.bool hasRevisionId() => $_has(3); @$pb.TagNumber(4) @@ -145,18 +129,15 @@ class Schema extends $pb.GeneratedMessage { /// Output only. The timestamp that the revision was created. @$pb.TagNumber(6) - $3.Timestamp get revisionCreateTime => $_getN(4); + $2.Timestamp get revisionCreateTime => $_getN(4); @$pb.TagNumber(6) - set revisionCreateTime($3.Timestamp v) { - $_setField(6, v); - } - + set revisionCreateTime($2.Timestamp value) => $_setField(6, value); @$pb.TagNumber(6) $core.bool hasRevisionCreateTime() => $_has(4); @$pb.TagNumber(6) void clearRevisionCreateTime() => $_clearField(6); @$pb.TagNumber(6) - $3.Timestamp ensureRevisionCreateTime() => $_ensure(4); + $2.Timestamp ensureRevisionCreateTime() => $_ensure(4); } /// Request for the CreateSchema method. @@ -166,25 +147,21 @@ class CreateSchemaRequest extends $pb.GeneratedMessage { Schema? schema, $core.String? schemaId, }) { - final $result = create(); - if (parent != null) { - $result.parent = parent; - } - if (schema != null) { - $result.schema = schema; - } - if (schemaId != null) { - $result.schemaId = schemaId; - } - return $result; + final result = create(); + if (parent != null) result.parent = parent; + if (schema != null) result.schema = schema; + if (schemaId != null) result.schemaId = schemaId; + return result; } - CreateSchemaRequest._() : super(); - factory CreateSchemaRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory CreateSchemaRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + CreateSchemaRequest._(); + + factory CreateSchemaRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CreateSchemaRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'CreateSchemaRequest', @@ -203,10 +180,12 @@ class CreateSchemaRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as CreateSchemaRequest)) as CreateSchemaRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static CreateSchemaRequest create() => CreateSchemaRequest._(); + @$core.override CreateSchemaRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -220,10 +199,7 @@ class CreateSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get parent => $_getSZ(0); @$pb.TagNumber(1) - set parent($core.String v) { - $_setString(0, v); - } - + set parent($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasParent() => $_has(0); @$pb.TagNumber(1) @@ -237,10 +213,7 @@ class CreateSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) Schema get schema => $_getN(1); @$pb.TagNumber(2) - set schema(Schema v) { - $_setField(2, v); - } - + set schema(Schema value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasSchema() => $_has(1); @$pb.TagNumber(2) @@ -256,10 +229,7 @@ class CreateSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get schemaId => $_getSZ(2); @$pb.TagNumber(3) - set schemaId($core.String v) { - $_setString(2, v); - } - + set schemaId($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasSchemaId() => $_has(2); @$pb.TagNumber(3) @@ -272,22 +242,20 @@ class GetSchemaRequest extends $pb.GeneratedMessage { $core.String? name, SchemaView? view, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (view != null) { - $result.view = view; - } - return $result; + final result = create(); + if (name != null) result.name = name; + if (view != null) result.view = view; + return result; } - GetSchemaRequest._() : super(); - factory GetSchemaRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory GetSchemaRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + GetSchemaRequest._(); + + factory GetSchemaRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory GetSchemaRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'GetSchemaRequest', @@ -308,10 +276,12 @@ class GetSchemaRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as GetSchemaRequest)) as GetSchemaRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static GetSchemaRequest create() => GetSchemaRequest._(); + @$core.override GetSchemaRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -325,10 +295,7 @@ class GetSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -339,10 +306,7 @@ class GetSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) SchemaView get view => $_getN(1); @$pb.TagNumber(2) - set view(SchemaView v) { - $_setField(2, v); - } - + set view(SchemaView value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasView() => $_has(1); @$pb.TagNumber(2) @@ -357,28 +321,22 @@ class ListSchemasRequest extends $pb.GeneratedMessage { $core.int? pageSize, $core.String? pageToken, }) { - final $result = create(); - if (parent != null) { - $result.parent = parent; - } - if (view != null) { - $result.view = view; - } - if (pageSize != null) { - $result.pageSize = pageSize; - } - if (pageToken != null) { - $result.pageToken = pageToken; - } - return $result; + final result = create(); + if (parent != null) result.parent = parent; + if (view != null) result.view = view; + if (pageSize != null) result.pageSize = pageSize; + if (pageToken != null) result.pageToken = pageToken; + return result; } - ListSchemasRequest._() : super(); - factory ListSchemasRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListSchemasRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListSchemasRequest._(); + + factory ListSchemasRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListSchemasRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListSchemasRequest', @@ -401,10 +359,12 @@ class ListSchemasRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListSchemasRequest)) as ListSchemasRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListSchemasRequest create() => ListSchemasRequest._(); + @$core.override ListSchemasRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -418,10 +378,7 @@ class ListSchemasRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get parent => $_getSZ(0); @$pb.TagNumber(1) - set parent($core.String v) { - $_setString(0, v); - } - + set parent($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasParent() => $_has(0); @$pb.TagNumber(1) @@ -433,10 +390,7 @@ class ListSchemasRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) SchemaView get view => $_getN(1); @$pb.TagNumber(2) - set view(SchemaView v) { - $_setField(2, v); - } - + set view(SchemaView value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasView() => $_has(1); @$pb.TagNumber(2) @@ -446,10 +400,7 @@ class ListSchemasRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.int get pageSize => $_getIZ(2); @$pb.TagNumber(3) - set pageSize($core.int v) { - $_setSignedInt32(2, v); - } - + set pageSize($core.int value) => $_setSignedInt32(2, value); @$pb.TagNumber(3) $core.bool hasPageSize() => $_has(2); @$pb.TagNumber(3) @@ -461,10 +412,7 @@ class ListSchemasRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get pageToken => $_getSZ(3); @$pb.TagNumber(4) - set pageToken($core.String v) { - $_setString(3, v); - } - + set pageToken($core.String value) => $_setString(3, value); @$pb.TagNumber(4) $core.bool hasPageToken() => $_has(3); @$pb.TagNumber(4) @@ -477,22 +425,20 @@ class ListSchemasResponse extends $pb.GeneratedMessage { $core.Iterable? schemas, $core.String? nextPageToken, }) { - final $result = create(); - if (schemas != null) { - $result.schemas.addAll(schemas); - } - if (nextPageToken != null) { - $result.nextPageToken = nextPageToken; - } - return $result; + final result = create(); + if (schemas != null) result.schemas.addAll(schemas); + if (nextPageToken != null) result.nextPageToken = nextPageToken; + return result; } - ListSchemasResponse._() : super(); - factory ListSchemasResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListSchemasResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListSchemasResponse._(); + + factory ListSchemasResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListSchemasResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListSchemasResponse', @@ -511,10 +457,12 @@ class ListSchemasResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ListSchemasResponse)) as ListSchemasResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListSchemasResponse create() => ListSchemasResponse._(); + @$core.override ListSchemasResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -532,10 +480,7 @@ class ListSchemasResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get nextPageToken => $_getSZ(1); @$pb.TagNumber(2) - set nextPageToken($core.String v) { - $_setString(1, v); - } - + set nextPageToken($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasNextPageToken() => $_has(1); @$pb.TagNumber(2) @@ -550,28 +495,22 @@ class ListSchemaRevisionsRequest extends $pb.GeneratedMessage { $core.int? pageSize, $core.String? pageToken, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (view != null) { - $result.view = view; - } - if (pageSize != null) { - $result.pageSize = pageSize; - } - if (pageToken != null) { - $result.pageToken = pageToken; - } - return $result; + final result = create(); + if (name != null) result.name = name; + if (view != null) result.view = view; + if (pageSize != null) result.pageSize = pageSize; + if (pageToken != null) result.pageToken = pageToken; + return result; } - ListSchemaRevisionsRequest._() : super(); - factory ListSchemaRevisionsRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListSchemaRevisionsRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListSchemaRevisionsRequest._(); + + factory ListSchemaRevisionsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListSchemaRevisionsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListSchemaRevisionsRequest', @@ -597,10 +536,12 @@ class ListSchemaRevisionsRequest extends $pb.GeneratedMessage { (message) => updates(message as ListSchemaRevisionsRequest)) as ListSchemaRevisionsRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListSchemaRevisionsRequest create() => ListSchemaRevisionsRequest._(); + @$core.override ListSchemaRevisionsRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -613,10 +554,7 @@ class ListSchemaRevisionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -628,10 +566,7 @@ class ListSchemaRevisionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) SchemaView get view => $_getN(1); @$pb.TagNumber(2) - set view(SchemaView v) { - $_setField(2, v); - } - + set view(SchemaView value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasView() => $_has(1); @$pb.TagNumber(2) @@ -641,10 +576,7 @@ class ListSchemaRevisionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.int get pageSize => $_getIZ(2); @$pb.TagNumber(3) - set pageSize($core.int v) { - $_setSignedInt32(2, v); - } - + set pageSize($core.int value) => $_setSignedInt32(2, value); @$pb.TagNumber(3) $core.bool hasPageSize() => $_has(2); @$pb.TagNumber(3) @@ -655,10 +587,7 @@ class ListSchemaRevisionsRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get pageToken => $_getSZ(3); @$pb.TagNumber(4) - set pageToken($core.String v) { - $_setString(3, v); - } - + set pageToken($core.String value) => $_setString(3, value); @$pb.TagNumber(4) $core.bool hasPageToken() => $_has(3); @$pb.TagNumber(4) @@ -671,22 +600,20 @@ class ListSchemaRevisionsResponse extends $pb.GeneratedMessage { $core.Iterable? schemas, $core.String? nextPageToken, }) { - final $result = create(); - if (schemas != null) { - $result.schemas.addAll(schemas); - } - if (nextPageToken != null) { - $result.nextPageToken = nextPageToken; - } - return $result; + final result = create(); + if (schemas != null) result.schemas.addAll(schemas); + if (nextPageToken != null) result.nextPageToken = nextPageToken; + return result; } - ListSchemaRevisionsResponse._() : super(); - factory ListSchemaRevisionsResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ListSchemaRevisionsResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ListSchemaRevisionsResponse._(); + + factory ListSchemaRevisionsResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListSchemaRevisionsResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ListSchemaRevisionsResponse', @@ -708,11 +635,13 @@ class ListSchemaRevisionsResponse extends $pb.GeneratedMessage { (message) => updates(message as ListSchemaRevisionsResponse)) as ListSchemaRevisionsResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ListSchemaRevisionsResponse create() => ListSchemaRevisionsResponse._(); + @$core.override ListSchemaRevisionsResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -730,10 +659,7 @@ class ListSchemaRevisionsResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get nextPageToken => $_getSZ(1); @$pb.TagNumber(2) - set nextPageToken($core.String v) { - $_setString(1, v); - } - + set nextPageToken($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasNextPageToken() => $_has(1); @$pb.TagNumber(2) @@ -746,22 +672,20 @@ class CommitSchemaRequest extends $pb.GeneratedMessage { $core.String? name, Schema? schema, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (schema != null) { - $result.schema = schema; - } - return $result; + final result = create(); + if (name != null) result.name = name; + if (schema != null) result.schema = schema; + return result; } - CommitSchemaRequest._() : super(); - factory CommitSchemaRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory CommitSchemaRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + CommitSchemaRequest._(); + + factory CommitSchemaRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CommitSchemaRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'CommitSchemaRequest', @@ -779,10 +703,12 @@ class CommitSchemaRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as CommitSchemaRequest)) as CommitSchemaRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static CommitSchemaRequest create() => CommitSchemaRequest._(); + @$core.override CommitSchemaRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -796,10 +722,7 @@ class CommitSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -809,10 +732,7 @@ class CommitSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) Schema get schema => $_getN(1); @$pb.TagNumber(2) - set schema(Schema v) { - $_setField(2, v); - } - + set schema(Schema value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasSchema() => $_has(1); @$pb.TagNumber(2) @@ -827,22 +747,20 @@ class RollbackSchemaRequest extends $pb.GeneratedMessage { $core.String? name, $core.String? revisionId, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (revisionId != null) { - $result.revisionId = revisionId; - } - return $result; + final result = create(); + if (name != null) result.name = name; + if (revisionId != null) result.revisionId = revisionId; + return result; } - RollbackSchemaRequest._() : super(); - factory RollbackSchemaRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory RollbackSchemaRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + RollbackSchemaRequest._(); + + factory RollbackSchemaRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory RollbackSchemaRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'RollbackSchemaRequest', @@ -862,10 +780,12 @@ class RollbackSchemaRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as RollbackSchemaRequest)) as RollbackSchemaRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static RollbackSchemaRequest create() => RollbackSchemaRequest._(); + @$core.override RollbackSchemaRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -878,10 +798,7 @@ class RollbackSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -894,10 +811,7 @@ class RollbackSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get revisionId => $_getSZ(1); @$pb.TagNumber(2) - set revisionId($core.String v) { - $_setString(1, v); - } - + set revisionId($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasRevisionId() => $_has(1); @$pb.TagNumber(2) @@ -910,23 +824,20 @@ class DeleteSchemaRevisionRequest extends $pb.GeneratedMessage { $core.String? name, @$core.Deprecated('This field is deprecated.') $core.String? revisionId, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - if (revisionId != null) { - // ignore: deprecated_member_use_from_same_package - $result.revisionId = revisionId; - } - return $result; + final result = create(); + if (name != null) result.name = name; + if (revisionId != null) result.revisionId = revisionId; + return result; } - DeleteSchemaRevisionRequest._() : super(); - factory DeleteSchemaRevisionRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DeleteSchemaRevisionRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + DeleteSchemaRevisionRequest._(); + + factory DeleteSchemaRevisionRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DeleteSchemaRevisionRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'DeleteSchemaRevisionRequest', @@ -947,11 +858,13 @@ class DeleteSchemaRevisionRequest extends $pb.GeneratedMessage { (message) => updates(message as DeleteSchemaRevisionRequest)) as DeleteSchemaRevisionRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DeleteSchemaRevisionRequest create() => DeleteSchemaRevisionRequest._(); + @$core.override DeleteSchemaRevisionRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -967,10 +880,7 @@ class DeleteSchemaRevisionRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -984,10 +894,7 @@ class DeleteSchemaRevisionRequest extends $pb.GeneratedMessage { $core.String get revisionId => $_getSZ(1); @$core.Deprecated('This field is deprecated.') @$pb.TagNumber(2) - set revisionId($core.String v) { - $_setString(1, v); - } - + set revisionId($core.String value) => $_setString(1, value); @$core.Deprecated('This field is deprecated.') @$pb.TagNumber(2) $core.bool hasRevisionId() => $_has(1); @@ -1001,19 +908,19 @@ class DeleteSchemaRequest extends $pb.GeneratedMessage { factory DeleteSchemaRequest({ $core.String? name, }) { - final $result = create(); - if (name != null) { - $result.name = name; - } - return $result; + final result = create(); + if (name != null) result.name = name; + return result; } - DeleteSchemaRequest._() : super(); - factory DeleteSchemaRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DeleteSchemaRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + DeleteSchemaRequest._(); + + factory DeleteSchemaRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DeleteSchemaRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'DeleteSchemaRequest', @@ -1030,10 +937,12 @@ class DeleteSchemaRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as DeleteSchemaRequest)) as DeleteSchemaRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DeleteSchemaRequest create() => DeleteSchemaRequest._(); + @$core.override DeleteSchemaRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1047,10 +956,7 @@ class DeleteSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) - set name($core.String v) { - $_setString(0, v); - } - + set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) @@ -1063,22 +969,20 @@ class ValidateSchemaRequest extends $pb.GeneratedMessage { $core.String? parent, Schema? schema, }) { - final $result = create(); - if (parent != null) { - $result.parent = parent; - } - if (schema != null) { - $result.schema = schema; - } - return $result; + final result = create(); + if (parent != null) result.parent = parent; + if (schema != null) result.schema = schema; + return result; } - ValidateSchemaRequest._() : super(); - factory ValidateSchemaRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ValidateSchemaRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ValidateSchemaRequest._(); + + factory ValidateSchemaRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ValidateSchemaRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ValidateSchemaRequest', @@ -1098,10 +1002,12 @@ class ValidateSchemaRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ValidateSchemaRequest)) as ValidateSchemaRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ValidateSchemaRequest create() => ValidateSchemaRequest._(); + @$core.override ValidateSchemaRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1115,10 +1021,7 @@ class ValidateSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get parent => $_getSZ(0); @$pb.TagNumber(1) - set parent($core.String v) { - $_setString(0, v); - } - + set parent($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasParent() => $_has(0); @$pb.TagNumber(1) @@ -1128,10 +1031,7 @@ class ValidateSchemaRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) Schema get schema => $_getN(1); @$pb.TagNumber(2) - set schema(Schema v) { - $_setField(2, v); - } - + set schema(Schema value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasSchema() => $_has(1); @$pb.TagNumber(2) @@ -1144,13 +1044,15 @@ class ValidateSchemaRequest extends $pb.GeneratedMessage { /// Empty for now. class ValidateSchemaResponse extends $pb.GeneratedMessage { factory ValidateSchemaResponse() => create(); - ValidateSchemaResponse._() : super(); - factory ValidateSchemaResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ValidateSchemaResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ValidateSchemaResponse._(); + + factory ValidateSchemaResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ValidateSchemaResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ValidateSchemaResponse', @@ -1168,10 +1070,12 @@ class ValidateSchemaResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ValidateSchemaResponse)) as ValidateSchemaResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ValidateSchemaResponse create() => ValidateSchemaResponse._(); + @$core.override ValidateSchemaResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1192,31 +1096,23 @@ class ValidateMessageRequest extends $pb.GeneratedMessage { $core.List<$core.int>? message, Encoding? encoding, }) { - final $result = create(); - if (parent != null) { - $result.parent = parent; - } - if (name != null) { - $result.name = name; - } - if (schema != null) { - $result.schema = schema; - } - if (message != null) { - $result.message = message; - } - if (encoding != null) { - $result.encoding = encoding; - } - return $result; + final result = create(); + if (parent != null) result.parent = parent; + if (name != null) result.name = name; + if (schema != null) result.schema = schema; + if (message != null) result.message = message; + if (encoding != null) result.encoding = encoding; + return result; } - ValidateMessageRequest._() : super(); - factory ValidateMessageRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ValidateMessageRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ValidateMessageRequest._(); + + factory ValidateMessageRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ValidateMessageRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static const $core.Map<$core.int, ValidateMessageRequest_SchemaSpec> _ValidateMessageRequest_SchemaSpecByTag = { @@ -1250,10 +1146,12 @@ class ValidateMessageRequest extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ValidateMessageRequest)) as ValidateMessageRequest; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ValidateMessageRequest create() => ValidateMessageRequest._(); + @$core.override ValidateMessageRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1271,10 +1169,7 @@ class ValidateMessageRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get parent => $_getSZ(0); @$pb.TagNumber(1) - set parent($core.String v) { - $_setString(0, v); - } - + set parent($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasParent() => $_has(0); @$pb.TagNumber(1) @@ -1286,10 +1181,7 @@ class ValidateMessageRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get name => $_getSZ(1); @$pb.TagNumber(2) - set name($core.String v) { - $_setString(1, v); - } - + set name($core.String value) => $_setString(1, value); @$pb.TagNumber(2) $core.bool hasName() => $_has(1); @$pb.TagNumber(2) @@ -1299,10 +1191,7 @@ class ValidateMessageRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) Schema get schema => $_getN(2); @$pb.TagNumber(3) - set schema(Schema v) { - $_setField(3, v); - } - + set schema(Schema value) => $_setField(3, value); @$pb.TagNumber(3) $core.bool hasSchema() => $_has(2); @$pb.TagNumber(3) @@ -1314,10 +1203,7 @@ class ValidateMessageRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.List<$core.int> get message => $_getN(3); @$pb.TagNumber(4) - set message($core.List<$core.int> v) { - $_setBytes(3, v); - } - + set message($core.List<$core.int> value) => $_setBytes(3, value); @$pb.TagNumber(4) $core.bool hasMessage() => $_has(3); @$pb.TagNumber(4) @@ -1327,10 +1213,7 @@ class ValidateMessageRequest extends $pb.GeneratedMessage { @$pb.TagNumber(5) Encoding get encoding => $_getN(4); @$pb.TagNumber(5) - set encoding(Encoding v) { - $_setField(5, v); - } - + set encoding(Encoding value) => $_setField(5, value); @$pb.TagNumber(5) $core.bool hasEncoding() => $_has(4); @$pb.TagNumber(5) @@ -1341,13 +1224,15 @@ class ValidateMessageRequest extends $pb.GeneratedMessage { /// Empty for now. class ValidateMessageResponse extends $pb.GeneratedMessage { factory ValidateMessageResponse() => create(); - ValidateMessageResponse._() : super(); - factory ValidateMessageResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ValidateMessageResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); + + ValidateMessageResponse._(); + + factory ValidateMessageResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ValidateMessageResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo( _omitMessageNames ? '' : 'ValidateMessageResponse', @@ -1365,10 +1250,12 @@ class ValidateMessageResponse extends $pb.GeneratedMessage { super.copyWith((message) => updates(message as ValidateMessageResponse)) as ValidateMessageResponse; + @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ValidateMessageResponse create() => ValidateMessageResponse._(); + @$core.override ValidateMessageResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @@ -1378,6 +1265,7 @@ class ValidateMessageResponse extends $pb.GeneratedMessage { static ValidateMessageResponse? _defaultInstance; } -const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbenum.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbenum.dart index 7650fb74..a773fb10 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbenum.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbenum.dart @@ -1,13 +1,14 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/pubsub/v1/schema.proto -// +// Generated from google/pubsub/v1/schema.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; @@ -38,7 +39,7 @@ class SchemaView extends $pb.ProtobufEnum { static SchemaView? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const SchemaView._(super.v, super.n); + const SchemaView._(super.value, super.name); } /// Possible encoding types for messages. @@ -65,7 +66,7 @@ class Encoding extends $pb.ProtobufEnum { static Encoding? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const Encoding._(super.v, super.n); + const Encoding._(super.value, super.name); } /// Possible schema definition types. @@ -93,7 +94,8 @@ class Schema_Type extends $pb.ProtobufEnum { static Schema_Type? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; - const Schema_Type._(super.v, super.n); + const Schema_Type._(super.value, super.name); } -const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names'); +const $core.bool _omitEnumNames = + $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbgrpc.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbgrpc.dart index ab295e4a..3c0fb9fb 100644 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbgrpc.dart +++ b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbgrpc.dart @@ -1,13 +1,14 @@ +// This is a generated file - do not edit. // -// Generated code. Do not modify. -// source: google/pubsub/v1/schema.proto -// +// Generated from google/pubsub/v1/schema.proto. + // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names import 'dart:async' as $async; import 'dart:core' as $core; @@ -16,7 +17,7 @@ import 'package:grpc/service_api.dart' as $grpc; import 'package:protobuf/protobuf.dart' as $pb; import '../../protobuf/empty.pb.dart' as $1; -import 'schema.pb.dart' as $2; +import 'schema.pb.dart' as $0; export 'schema.pb.dart'; @@ -32,127 +33,139 @@ class SchemaServiceClient extends $grpc.Client { 'https://www.googleapis.com/auth/pubsub', ]; - static final _$createSchema = - $grpc.ClientMethod<$2.CreateSchemaRequest, $2.Schema>( - '/google.pubsub.v1.SchemaService/CreateSchema', - ($2.CreateSchemaRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); - static final _$getSchema = $grpc.ClientMethod<$2.GetSchemaRequest, $2.Schema>( - '/google.pubsub.v1.SchemaService/GetSchema', - ($2.GetSchemaRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); - static final _$listSchemas = - $grpc.ClientMethod<$2.ListSchemasRequest, $2.ListSchemasResponse>( - '/google.pubsub.v1.SchemaService/ListSchemas', - ($2.ListSchemasRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $2.ListSchemasResponse.fromBuffer(value)); - static final _$listSchemaRevisions = $grpc.ClientMethod< - $2.ListSchemaRevisionsRequest, $2.ListSchemaRevisionsResponse>( - '/google.pubsub.v1.SchemaService/ListSchemaRevisions', - ($2.ListSchemaRevisionsRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $2.ListSchemaRevisionsResponse.fromBuffer(value)); - static final _$commitSchema = - $grpc.ClientMethod<$2.CommitSchemaRequest, $2.Schema>( - '/google.pubsub.v1.SchemaService/CommitSchema', - ($2.CommitSchemaRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); - static final _$rollbackSchema = - $grpc.ClientMethod<$2.RollbackSchemaRequest, $2.Schema>( - '/google.pubsub.v1.SchemaService/RollbackSchema', - ($2.RollbackSchemaRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); - static final _$deleteSchemaRevision = - $grpc.ClientMethod<$2.DeleteSchemaRevisionRequest, $2.Schema>( - '/google.pubsub.v1.SchemaService/DeleteSchemaRevision', - ($2.DeleteSchemaRevisionRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $2.Schema.fromBuffer(value)); - static final _$deleteSchema = - $grpc.ClientMethod<$2.DeleteSchemaRequest, $1.Empty>( - '/google.pubsub.v1.SchemaService/DeleteSchema', - ($2.DeleteSchemaRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $1.Empty.fromBuffer(value)); - static final _$validateSchema = - $grpc.ClientMethod<$2.ValidateSchemaRequest, $2.ValidateSchemaResponse>( - '/google.pubsub.v1.SchemaService/ValidateSchema', - ($2.ValidateSchemaRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $2.ValidateSchemaResponse.fromBuffer(value)); - static final _$validateMessage = - $grpc.ClientMethod<$2.ValidateMessageRequest, $2.ValidateMessageResponse>( - '/google.pubsub.v1.SchemaService/ValidateMessage', - ($2.ValidateMessageRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => - $2.ValidateMessageResponse.fromBuffer(value)); - SchemaServiceClient(super.channel, {super.options, super.interceptors}); /// Creates a schema. - $grpc.ResponseFuture<$2.Schema> createSchema($2.CreateSchemaRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Schema> createSchema( + $0.CreateSchemaRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$createSchema, request, options: options); } /// Gets a schema. - $grpc.ResponseFuture<$2.Schema> getSchema($2.GetSchemaRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Schema> getSchema( + $0.GetSchemaRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$getSchema, request, options: options); } /// Lists schemas in a project. - $grpc.ResponseFuture<$2.ListSchemasResponse> listSchemas( - $2.ListSchemasRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.ListSchemasResponse> listSchemas( + $0.ListSchemasRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$listSchemas, request, options: options); } /// Lists all schema revisions for the named schema. - $grpc.ResponseFuture<$2.ListSchemaRevisionsResponse> listSchemaRevisions( - $2.ListSchemaRevisionsRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.ListSchemaRevisionsResponse> listSchemaRevisions( + $0.ListSchemaRevisionsRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$listSchemaRevisions, request, options: options); } /// Commits a new schema revision to an existing schema. - $grpc.ResponseFuture<$2.Schema> commitSchema($2.CommitSchemaRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Schema> commitSchema( + $0.CommitSchemaRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$commitSchema, request, options: options); } /// Creates a new schema revision that is a copy of the provided revision_id. - $grpc.ResponseFuture<$2.Schema> rollbackSchema( - $2.RollbackSchemaRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Schema> rollbackSchema( + $0.RollbackSchemaRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$rollbackSchema, request, options: options); } /// Deletes a specific schema revision. - $grpc.ResponseFuture<$2.Schema> deleteSchemaRevision( - $2.DeleteSchemaRevisionRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.Schema> deleteSchemaRevision( + $0.DeleteSchemaRevisionRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$deleteSchemaRevision, request, options: options); } /// Deletes a schema. - $grpc.ResponseFuture<$1.Empty> deleteSchema($2.DeleteSchemaRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$1.Empty> deleteSchema( + $0.DeleteSchemaRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$deleteSchema, request, options: options); } /// Validates a schema. - $grpc.ResponseFuture<$2.ValidateSchemaResponse> validateSchema( - $2.ValidateSchemaRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.ValidateSchemaResponse> validateSchema( + $0.ValidateSchemaRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$validateSchema, request, options: options); } /// Validates a message against a schema. - $grpc.ResponseFuture<$2.ValidateMessageResponse> validateMessage( - $2.ValidateMessageRequest request, - {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.ValidateMessageResponse> validateMessage( + $0.ValidateMessageRequest request, { + $grpc.CallOptions? options, + }) { return $createUnaryCall(_$validateMessage, request, options: options); } + + // method descriptors + + static final _$createSchema = + $grpc.ClientMethod<$0.CreateSchemaRequest, $0.Schema>( + '/google.pubsub.v1.SchemaService/CreateSchema', + ($0.CreateSchemaRequest value) => value.writeToBuffer(), + $0.Schema.fromBuffer); + static final _$getSchema = $grpc.ClientMethod<$0.GetSchemaRequest, $0.Schema>( + '/google.pubsub.v1.SchemaService/GetSchema', + ($0.GetSchemaRequest value) => value.writeToBuffer(), + $0.Schema.fromBuffer); + static final _$listSchemas = + $grpc.ClientMethod<$0.ListSchemasRequest, $0.ListSchemasResponse>( + '/google.pubsub.v1.SchemaService/ListSchemas', + ($0.ListSchemasRequest value) => value.writeToBuffer(), + $0.ListSchemasResponse.fromBuffer); + static final _$listSchemaRevisions = $grpc.ClientMethod< + $0.ListSchemaRevisionsRequest, $0.ListSchemaRevisionsResponse>( + '/google.pubsub.v1.SchemaService/ListSchemaRevisions', + ($0.ListSchemaRevisionsRequest value) => value.writeToBuffer(), + $0.ListSchemaRevisionsResponse.fromBuffer); + static final _$commitSchema = + $grpc.ClientMethod<$0.CommitSchemaRequest, $0.Schema>( + '/google.pubsub.v1.SchemaService/CommitSchema', + ($0.CommitSchemaRequest value) => value.writeToBuffer(), + $0.Schema.fromBuffer); + static final _$rollbackSchema = + $grpc.ClientMethod<$0.RollbackSchemaRequest, $0.Schema>( + '/google.pubsub.v1.SchemaService/RollbackSchema', + ($0.RollbackSchemaRequest value) => value.writeToBuffer(), + $0.Schema.fromBuffer); + static final _$deleteSchemaRevision = + $grpc.ClientMethod<$0.DeleteSchemaRevisionRequest, $0.Schema>( + '/google.pubsub.v1.SchemaService/DeleteSchemaRevision', + ($0.DeleteSchemaRevisionRequest value) => value.writeToBuffer(), + $0.Schema.fromBuffer); + static final _$deleteSchema = + $grpc.ClientMethod<$0.DeleteSchemaRequest, $1.Empty>( + '/google.pubsub.v1.SchemaService/DeleteSchema', + ($0.DeleteSchemaRequest value) => value.writeToBuffer(), + $1.Empty.fromBuffer); + static final _$validateSchema = + $grpc.ClientMethod<$0.ValidateSchemaRequest, $0.ValidateSchemaResponse>( + '/google.pubsub.v1.SchemaService/ValidateSchema', + ($0.ValidateSchemaRequest value) => value.writeToBuffer(), + $0.ValidateSchemaResponse.fromBuffer); + static final _$validateMessage = + $grpc.ClientMethod<$0.ValidateMessageRequest, $0.ValidateMessageResponse>( + '/google.pubsub.v1.SchemaService/ValidateMessage', + ($0.ValidateMessageRequest value) => value.writeToBuffer(), + $0.ValidateMessageResponse.fromBuffer); } @$pb.GrpcServiceName('google.pubsub.v1.SchemaService') @@ -160,162 +173,171 @@ abstract class SchemaServiceBase extends $grpc.Service { $core.String get $name => 'google.pubsub.v1.SchemaService'; SchemaServiceBase() { - $addMethod($grpc.ServiceMethod<$2.CreateSchemaRequest, $2.Schema>( + $addMethod($grpc.ServiceMethod<$0.CreateSchemaRequest, $0.Schema>( 'CreateSchema', createSchema_Pre, false, false, ($core.List<$core.int> value) => - $2.CreateSchemaRequest.fromBuffer(value), - ($2.Schema value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$2.GetSchemaRequest, $2.Schema>( + $0.CreateSchemaRequest.fromBuffer(value), + ($0.Schema value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.GetSchemaRequest, $0.Schema>( 'GetSchema', getSchema_Pre, false, false, - ($core.List<$core.int> value) => $2.GetSchemaRequest.fromBuffer(value), - ($2.Schema value) => value.writeToBuffer())); + ($core.List<$core.int> value) => $0.GetSchemaRequest.fromBuffer(value), + ($0.Schema value) => value.writeToBuffer())); $addMethod( - $grpc.ServiceMethod<$2.ListSchemasRequest, $2.ListSchemasResponse>( + $grpc.ServiceMethod<$0.ListSchemasRequest, $0.ListSchemasResponse>( 'ListSchemas', listSchemas_Pre, false, false, ($core.List<$core.int> value) => - $2.ListSchemasRequest.fromBuffer(value), - ($2.ListSchemasResponse value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$2.ListSchemaRevisionsRequest, - $2.ListSchemaRevisionsResponse>( + $0.ListSchemasRequest.fromBuffer(value), + ($0.ListSchemasResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.ListSchemaRevisionsRequest, + $0.ListSchemaRevisionsResponse>( 'ListSchemaRevisions', listSchemaRevisions_Pre, false, false, ($core.List<$core.int> value) => - $2.ListSchemaRevisionsRequest.fromBuffer(value), - ($2.ListSchemaRevisionsResponse value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$2.CommitSchemaRequest, $2.Schema>( + $0.ListSchemaRevisionsRequest.fromBuffer(value), + ($0.ListSchemaRevisionsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.CommitSchemaRequest, $0.Schema>( 'CommitSchema', commitSchema_Pre, false, false, ($core.List<$core.int> value) => - $2.CommitSchemaRequest.fromBuffer(value), - ($2.Schema value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$2.RollbackSchemaRequest, $2.Schema>( + $0.CommitSchemaRequest.fromBuffer(value), + ($0.Schema value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.RollbackSchemaRequest, $0.Schema>( 'RollbackSchema', rollbackSchema_Pre, false, false, ($core.List<$core.int> value) => - $2.RollbackSchemaRequest.fromBuffer(value), - ($2.Schema value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$2.DeleteSchemaRevisionRequest, $2.Schema>( + $0.RollbackSchemaRequest.fromBuffer(value), + ($0.Schema value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.DeleteSchemaRevisionRequest, $0.Schema>( 'DeleteSchemaRevision', deleteSchemaRevision_Pre, false, false, ($core.List<$core.int> value) => - $2.DeleteSchemaRevisionRequest.fromBuffer(value), - ($2.Schema value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$2.DeleteSchemaRequest, $1.Empty>( + $0.DeleteSchemaRevisionRequest.fromBuffer(value), + ($0.Schema value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.DeleteSchemaRequest, $1.Empty>( 'DeleteSchema', deleteSchema_Pre, false, false, ($core.List<$core.int> value) => - $2.DeleteSchemaRequest.fromBuffer(value), + $0.DeleteSchemaRequest.fromBuffer(value), ($1.Empty value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$2.ValidateSchemaRequest, - $2.ValidateSchemaResponse>( + $addMethod($grpc.ServiceMethod<$0.ValidateSchemaRequest, + $0.ValidateSchemaResponse>( 'ValidateSchema', validateSchema_Pre, false, false, ($core.List<$core.int> value) => - $2.ValidateSchemaRequest.fromBuffer(value), - ($2.ValidateSchemaResponse value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$2.ValidateMessageRequest, - $2.ValidateMessageResponse>( + $0.ValidateSchemaRequest.fromBuffer(value), + ($0.ValidateSchemaResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.ValidateMessageRequest, + $0.ValidateMessageResponse>( 'ValidateMessage', validateMessage_Pre, false, false, ($core.List<$core.int> value) => - $2.ValidateMessageRequest.fromBuffer(value), - ($2.ValidateMessageResponse value) => value.writeToBuffer())); + $0.ValidateMessageRequest.fromBuffer(value), + ($0.ValidateMessageResponse value) => value.writeToBuffer())); } - $async.Future<$2.Schema> createSchema_Pre($grpc.ServiceCall $call, - $async.Future<$2.CreateSchemaRequest> $request) async { + $async.Future<$0.Schema> createSchema_Pre($grpc.ServiceCall $call, + $async.Future<$0.CreateSchemaRequest> $request) async { return createSchema($call, await $request); } - $async.Future<$2.Schema> getSchema_Pre($grpc.ServiceCall $call, - $async.Future<$2.GetSchemaRequest> $request) async { + $async.Future<$0.Schema> createSchema( + $grpc.ServiceCall call, $0.CreateSchemaRequest request); + + $async.Future<$0.Schema> getSchema_Pre($grpc.ServiceCall $call, + $async.Future<$0.GetSchemaRequest> $request) async { return getSchema($call, await $request); } - $async.Future<$2.ListSchemasResponse> listSchemas_Pre($grpc.ServiceCall $call, - $async.Future<$2.ListSchemasRequest> $request) async { + $async.Future<$0.Schema> getSchema( + $grpc.ServiceCall call, $0.GetSchemaRequest request); + + $async.Future<$0.ListSchemasResponse> listSchemas_Pre($grpc.ServiceCall $call, + $async.Future<$0.ListSchemasRequest> $request) async { return listSchemas($call, await $request); } - $async.Future<$2.ListSchemaRevisionsResponse> listSchemaRevisions_Pre( + $async.Future<$0.ListSchemasResponse> listSchemas( + $grpc.ServiceCall call, $0.ListSchemasRequest request); + + $async.Future<$0.ListSchemaRevisionsResponse> listSchemaRevisions_Pre( $grpc.ServiceCall $call, - $async.Future<$2.ListSchemaRevisionsRequest> $request) async { + $async.Future<$0.ListSchemaRevisionsRequest> $request) async { return listSchemaRevisions($call, await $request); } - $async.Future<$2.Schema> commitSchema_Pre($grpc.ServiceCall $call, - $async.Future<$2.CommitSchemaRequest> $request) async { + $async.Future<$0.ListSchemaRevisionsResponse> listSchemaRevisions( + $grpc.ServiceCall call, $0.ListSchemaRevisionsRequest request); + + $async.Future<$0.Schema> commitSchema_Pre($grpc.ServiceCall $call, + $async.Future<$0.CommitSchemaRequest> $request) async { return commitSchema($call, await $request); } - $async.Future<$2.Schema> rollbackSchema_Pre($grpc.ServiceCall $call, - $async.Future<$2.RollbackSchemaRequest> $request) async { + $async.Future<$0.Schema> commitSchema( + $grpc.ServiceCall call, $0.CommitSchemaRequest request); + + $async.Future<$0.Schema> rollbackSchema_Pre($grpc.ServiceCall $call, + $async.Future<$0.RollbackSchemaRequest> $request) async { return rollbackSchema($call, await $request); } - $async.Future<$2.Schema> deleteSchemaRevision_Pre($grpc.ServiceCall $call, - $async.Future<$2.DeleteSchemaRevisionRequest> $request) async { + $async.Future<$0.Schema> rollbackSchema( + $grpc.ServiceCall call, $0.RollbackSchemaRequest request); + + $async.Future<$0.Schema> deleteSchemaRevision_Pre($grpc.ServiceCall $call, + $async.Future<$0.DeleteSchemaRevisionRequest> $request) async { return deleteSchemaRevision($call, await $request); } + $async.Future<$0.Schema> deleteSchemaRevision( + $grpc.ServiceCall call, $0.DeleteSchemaRevisionRequest request); + $async.Future<$1.Empty> deleteSchema_Pre($grpc.ServiceCall $call, - $async.Future<$2.DeleteSchemaRequest> $request) async { + $async.Future<$0.DeleteSchemaRequest> $request) async { return deleteSchema($call, await $request); } - $async.Future<$2.ValidateSchemaResponse> validateSchema_Pre( + $async.Future<$1.Empty> deleteSchema( + $grpc.ServiceCall call, $0.DeleteSchemaRequest request); + + $async.Future<$0.ValidateSchemaResponse> validateSchema_Pre( $grpc.ServiceCall $call, - $async.Future<$2.ValidateSchemaRequest> $request) async { + $async.Future<$0.ValidateSchemaRequest> $request) async { return validateSchema($call, await $request); } - $async.Future<$2.ValidateMessageResponse> validateMessage_Pre( + $async.Future<$0.ValidateSchemaResponse> validateSchema( + $grpc.ServiceCall call, $0.ValidateSchemaRequest request); + + $async.Future<$0.ValidateMessageResponse> validateMessage_Pre( $grpc.ServiceCall $call, - $async.Future<$2.ValidateMessageRequest> $request) async { + $async.Future<$0.ValidateMessageRequest> $request) async { return validateMessage($call, await $request); } - $async.Future<$2.Schema> createSchema( - $grpc.ServiceCall call, $2.CreateSchemaRequest request); - $async.Future<$2.Schema> getSchema( - $grpc.ServiceCall call, $2.GetSchemaRequest request); - $async.Future<$2.ListSchemasResponse> listSchemas( - $grpc.ServiceCall call, $2.ListSchemasRequest request); - $async.Future<$2.ListSchemaRevisionsResponse> listSchemaRevisions( - $grpc.ServiceCall call, $2.ListSchemaRevisionsRequest request); - $async.Future<$2.Schema> commitSchema( - $grpc.ServiceCall call, $2.CommitSchemaRequest request); - $async.Future<$2.Schema> rollbackSchema( - $grpc.ServiceCall call, $2.RollbackSchemaRequest request); - $async.Future<$2.Schema> deleteSchemaRevision( - $grpc.ServiceCall call, $2.DeleteSchemaRevisionRequest request); - $async.Future<$1.Empty> deleteSchema( - $grpc.ServiceCall call, $2.DeleteSchemaRequest request); - $async.Future<$2.ValidateSchemaResponse> validateSchema( - $grpc.ServiceCall call, $2.ValidateSchemaRequest request); - $async.Future<$2.ValidateMessageResponse> validateMessage( - $grpc.ServiceCall call, $2.ValidateMessageRequest request); + $async.Future<$0.ValidateMessageResponse> validateMessage( + $grpc.ServiceCall call, $0.ValidateMessageRequest request); } diff --git a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbjson.dart b/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbjson.dart deleted file mode 100644 index ecca624b..00000000 --- a/pkgs/google_cloud_pubsub/lib/src/generated/google/pubsub/v1/schema.pbjson.dart +++ /dev/null @@ -1,389 +0,0 @@ -// -// Generated code. Do not modify. -// source: google/pubsub/v1/schema.proto -// -// @dart = 3.3 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -import 'dart:convert' as $convert; -import 'dart:core' as $core; -import 'dart:typed_data' as $typed_data; - -@$core.Deprecated('Use schemaViewDescriptor instead') -const SchemaView$json = { - '1': 'SchemaView', - '2': [ - {'1': 'SCHEMA_VIEW_UNSPECIFIED', '2': 0}, - {'1': 'BASIC', '2': 1}, - {'1': 'FULL', '2': 2}, - ], -}; - -/// Descriptor for `SchemaView`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List schemaViewDescriptor = $convert.base64Decode( - 'CgpTY2hlbWFWaWV3EhsKF1NDSEVNQV9WSUVXX1VOU1BFQ0lGSUVEEAASCQoFQkFTSUMQARIICg' - 'RGVUxMEAI='); - -@$core.Deprecated('Use encodingDescriptor instead') -const Encoding$json = { - '1': 'Encoding', - '2': [ - {'1': 'ENCODING_UNSPECIFIED', '2': 0}, - {'1': 'JSON', '2': 1}, - {'1': 'BINARY', '2': 2}, - ], -}; - -/// Descriptor for `Encoding`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List encodingDescriptor = $convert.base64Decode( - 'CghFbmNvZGluZxIYChRFTkNPRElOR19VTlNQRUNJRklFRBAAEggKBEpTT04QARIKCgZCSU5BUl' - 'kQAg=='); - -@$core.Deprecated('Use schemaDescriptor instead') -const Schema$json = { - '1': 'Schema', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - { - '1': 'type', - '3': 2, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.Schema.Type', - '10': 'type' - }, - {'1': 'definition', '3': 3, '4': 1, '5': 9, '10': 'definition'}, - {'1': 'revision_id', '3': 4, '4': 1, '5': 9, '8': {}, '10': 'revisionId'}, - { - '1': 'revision_create_time', - '3': 6, - '4': 1, - '5': 11, - '6': '.google.protobuf.Timestamp', - '8': {}, - '10': 'revisionCreateTime' - }, - ], - '4': [Schema_Type$json], - '7': {}, -}; - -@$core.Deprecated('Use schemaDescriptor instead') -const Schema_Type$json = { - '1': 'Type', - '2': [ - {'1': 'TYPE_UNSPECIFIED', '2': 0}, - {'1': 'PROTOCOL_BUFFER', '2': 1}, - {'1': 'AVRO', '2': 2}, - ], -}; - -/// Descriptor for `Schema`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List schemaDescriptor = $convert.base64Decode( - 'CgZTY2hlbWESFwoEbmFtZRgBIAEoCUID4EECUgRuYW1lEjEKBHR5cGUYAiABKA4yHS5nb29nbG' - 'UucHVic3ViLnYxLlNjaGVtYS5UeXBlUgR0eXBlEh4KCmRlZmluaXRpb24YAyABKAlSCmRlZmlu' - 'aXRpb24SJwoLcmV2aXNpb25faWQYBCABKAlCBuBBBeBBA1IKcmV2aXNpb25JZBJRChRyZXZpc2' - 'lvbl9jcmVhdGVfdGltZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBA1IS' - 'cmV2aXNpb25DcmVhdGVUaW1lIjsKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhMKD1BST1' - 'RPQ09MX0JVRkZFUhABEggKBEFWUk8QAjpG6kFDChxwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU2No' - 'ZW1hEiNwcm9qZWN0cy97cHJvamVjdH0vc2NoZW1hcy97c2NoZW1hfQ=='); - -@$core.Deprecated('Use createSchemaRequestDescriptor instead') -const CreateSchemaRequest$json = { - '1': 'CreateSchemaRequest', - '2': [ - {'1': 'parent', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'parent'}, - { - '1': 'schema', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.Schema', - '8': {}, - '10': 'schema' - }, - {'1': 'schema_id', '3': 3, '4': 1, '5': 9, '10': 'schemaId'}, - ], -}; - -/// Descriptor for `CreateSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List createSchemaRequestDescriptor = $convert.base64Decode( - 'ChNDcmVhdGVTY2hlbWFSZXF1ZXN0EjwKBnBhcmVudBgBIAEoCUIk4EEC+kEeEhxwdWJzdWIuZ2' - '9vZ2xlYXBpcy5jb20vU2NoZW1hUgZwYXJlbnQSNQoGc2NoZW1hGAIgASgLMhguZ29vZ2xlLnB1' - 'YnN1Yi52MS5TY2hlbWFCA+BBAlIGc2NoZW1hEhsKCXNjaGVtYV9pZBgDIAEoCVIIc2NoZW1hSW' - 'Q='); - -@$core.Deprecated('Use getSchemaRequestDescriptor instead') -const GetSchemaRequest$json = { - '1': 'GetSchemaRequest', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - { - '1': 'view', - '3': 2, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.SchemaView', - '10': 'view' - }, - ], -}; - -/// Descriptor for `GetSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List getSchemaRequestDescriptor = $convert.base64Decode( - 'ChBHZXRTY2hlbWFSZXF1ZXN0EjgKBG5hbWUYASABKAlCJOBBAvpBHgoccHVic3ViLmdvb2dsZW' - 'FwaXMuY29tL1NjaGVtYVIEbmFtZRIwCgR2aWV3GAIgASgOMhwuZ29vZ2xlLnB1YnN1Yi52MS5T' - 'Y2hlbWFWaWV3UgR2aWV3'); - -@$core.Deprecated('Use listSchemasRequestDescriptor instead') -const ListSchemasRequest$json = { - '1': 'ListSchemasRequest', - '2': [ - {'1': 'parent', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'parent'}, - { - '1': 'view', - '3': 2, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.SchemaView', - '10': 'view' - }, - {'1': 'page_size', '3': 3, '4': 1, '5': 5, '10': 'pageSize'}, - {'1': 'page_token', '3': 4, '4': 1, '5': 9, '10': 'pageToken'}, - ], -}; - -/// Descriptor for `ListSchemasRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listSchemasRequestDescriptor = $convert.base64Decode( - 'ChJMaXN0U2NoZW1hc1JlcXVlc3QSSwoGcGFyZW50GAEgASgJQjPgQQL6QS0KK2Nsb3VkcmVzb3' - 'VyY2VtYW5hZ2VyLmdvb2dsZWFwaXMuY29tL1Byb2plY3RSBnBhcmVudBIwCgR2aWV3GAIgASgO' - 'MhwuZ29vZ2xlLnB1YnN1Yi52MS5TY2hlbWFWaWV3UgR2aWV3EhsKCXBhZ2Vfc2l6ZRgDIAEoBV' - 'IIcGFnZVNpemUSHQoKcGFnZV90b2tlbhgEIAEoCVIJcGFnZVRva2Vu'); - -@$core.Deprecated('Use listSchemasResponseDescriptor instead') -const ListSchemasResponse$json = { - '1': 'ListSchemasResponse', - '2': [ - { - '1': 'schemas', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Schema', - '10': 'schemas' - }, - {'1': 'next_page_token', '3': 2, '4': 1, '5': 9, '10': 'nextPageToken'}, - ], -}; - -/// Descriptor for `ListSchemasResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listSchemasResponseDescriptor = $convert.base64Decode( - 'ChNMaXN0U2NoZW1hc1Jlc3BvbnNlEjIKB3NjaGVtYXMYASADKAsyGC5nb29nbGUucHVic3ViLn' - 'YxLlNjaGVtYVIHc2NoZW1hcxImCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAlSDW5leHRQYWdlVG9r' - 'ZW4='); - -@$core.Deprecated('Use listSchemaRevisionsRequestDescriptor instead') -const ListSchemaRevisionsRequest$json = { - '1': 'ListSchemaRevisionsRequest', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - { - '1': 'view', - '3': 2, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.SchemaView', - '10': 'view' - }, - {'1': 'page_size', '3': 3, '4': 1, '5': 5, '10': 'pageSize'}, - {'1': 'page_token', '3': 4, '4': 1, '5': 9, '10': 'pageToken'}, - ], -}; - -/// Descriptor for `ListSchemaRevisionsRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listSchemaRevisionsRequestDescriptor = $convert.base64Decode( - 'ChpMaXN0U2NoZW1hUmV2aXNpb25zUmVxdWVzdBI4CgRuYW1lGAEgASgJQiTgQQL6QR4KHHB1Yn' - 'N1Yi5nb29nbGVhcGlzLmNvbS9TY2hlbWFSBG5hbWUSMAoEdmlldxgCIAEoDjIcLmdvb2dsZS5w' - 'dWJzdWIudjEuU2NoZW1hVmlld1IEdmlldxIbCglwYWdlX3NpemUYAyABKAVSCHBhZ2VTaXplEh' - '0KCnBhZ2VfdG9rZW4YBCABKAlSCXBhZ2VUb2tlbg=='); - -@$core.Deprecated('Use listSchemaRevisionsResponseDescriptor instead') -const ListSchemaRevisionsResponse$json = { - '1': 'ListSchemaRevisionsResponse', - '2': [ - { - '1': 'schemas', - '3': 1, - '4': 3, - '5': 11, - '6': '.google.pubsub.v1.Schema', - '10': 'schemas' - }, - {'1': 'next_page_token', '3': 2, '4': 1, '5': 9, '10': 'nextPageToken'}, - ], -}; - -/// Descriptor for `ListSchemaRevisionsResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List listSchemaRevisionsResponseDescriptor = - $convert.base64Decode( - 'ChtMaXN0U2NoZW1hUmV2aXNpb25zUmVzcG9uc2USMgoHc2NoZW1hcxgBIAMoCzIYLmdvb2dsZS' - '5wdWJzdWIudjEuU2NoZW1hUgdzY2hlbWFzEiYKD25leHRfcGFnZV90b2tlbhgCIAEoCVINbmV4' - 'dFBhZ2VUb2tlbg=='); - -@$core.Deprecated('Use commitSchemaRequestDescriptor instead') -const CommitSchemaRequest$json = { - '1': 'CommitSchemaRequest', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - { - '1': 'schema', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.Schema', - '8': {}, - '10': 'schema' - }, - ], -}; - -/// Descriptor for `CommitSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List commitSchemaRequestDescriptor = $convert.base64Decode( - 'ChNDb21taXRTY2hlbWFSZXF1ZXN0EjgKBG5hbWUYASABKAlCJOBBAvpBHgoccHVic3ViLmdvb2' - 'dsZWFwaXMuY29tL1NjaGVtYVIEbmFtZRI1CgZzY2hlbWEYAiABKAsyGC5nb29nbGUucHVic3Vi' - 'LnYxLlNjaGVtYUID4EECUgZzY2hlbWE='); - -@$core.Deprecated('Use rollbackSchemaRequestDescriptor instead') -const RollbackSchemaRequest$json = { - '1': 'RollbackSchemaRequest', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - {'1': 'revision_id', '3': 2, '4': 1, '5': 9, '8': {}, '10': 'revisionId'}, - ], -}; - -/// Descriptor for `RollbackSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List rollbackSchemaRequestDescriptor = $convert.base64Decode( - 'ChVSb2xsYmFja1NjaGVtYVJlcXVlc3QSOAoEbmFtZRgBIAEoCUIk4EEC+kEeChxwdWJzdWIuZ2' - '9vZ2xlYXBpcy5jb20vU2NoZW1hUgRuYW1lEiQKC3JldmlzaW9uX2lkGAIgASgJQgPgQQJSCnJl' - 'dmlzaW9uSWQ='); - -@$core.Deprecated('Use deleteSchemaRevisionRequestDescriptor instead') -const DeleteSchemaRevisionRequest$json = { - '1': 'DeleteSchemaRevisionRequest', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - { - '1': 'revision_id', - '3': 2, - '4': 1, - '5': 9, - '8': {'3': true}, - '10': 'revisionId', - }, - ], -}; - -/// Descriptor for `DeleteSchemaRevisionRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List deleteSchemaRevisionRequestDescriptor = - $convert.base64Decode( - 'ChtEZWxldGVTY2hlbWFSZXZpc2lvblJlcXVlc3QSOAoEbmFtZRgBIAEoCUIk4EEC+kEeChxwdW' - 'JzdWIuZ29vZ2xlYXBpcy5jb20vU2NoZW1hUgRuYW1lEiYKC3JldmlzaW9uX2lkGAIgASgJQgUY' - 'AeBBAVIKcmV2aXNpb25JZA=='); - -@$core.Deprecated('Use deleteSchemaRequestDescriptor instead') -const DeleteSchemaRequest$json = { - '1': 'DeleteSchemaRequest', - '2': [ - {'1': 'name', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'name'}, - ], -}; - -/// Descriptor for `DeleteSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List deleteSchemaRequestDescriptor = $convert.base64Decode( - 'ChNEZWxldGVTY2hlbWFSZXF1ZXN0EjgKBG5hbWUYASABKAlCJOBBAvpBHgoccHVic3ViLmdvb2' - 'dsZWFwaXMuY29tL1NjaGVtYVIEbmFtZQ=='); - -@$core.Deprecated('Use validateSchemaRequestDescriptor instead') -const ValidateSchemaRequest$json = { - '1': 'ValidateSchemaRequest', - '2': [ - {'1': 'parent', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'parent'}, - { - '1': 'schema', - '3': 2, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.Schema', - '8': {}, - '10': 'schema' - }, - ], -}; - -/// Descriptor for `ValidateSchemaRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List validateSchemaRequestDescriptor = $convert.base64Decode( - 'ChVWYWxpZGF0ZVNjaGVtYVJlcXVlc3QSSwoGcGFyZW50GAEgASgJQjPgQQL6QS0KK2Nsb3Vkcm' - 'Vzb3VyY2VtYW5hZ2VyLmdvb2dsZWFwaXMuY29tL1Byb2plY3RSBnBhcmVudBI1CgZzY2hlbWEY' - 'AiABKAsyGC5nb29nbGUucHVic3ViLnYxLlNjaGVtYUID4EECUgZzY2hlbWE='); - -@$core.Deprecated('Use validateSchemaResponseDescriptor instead') -const ValidateSchemaResponse$json = { - '1': 'ValidateSchemaResponse', -}; - -/// Descriptor for `ValidateSchemaResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List validateSchemaResponseDescriptor = - $convert.base64Decode('ChZWYWxpZGF0ZVNjaGVtYVJlc3BvbnNl'); - -@$core.Deprecated('Use validateMessageRequestDescriptor instead') -const ValidateMessageRequest$json = { - '1': 'ValidateMessageRequest', - '2': [ - {'1': 'parent', '3': 1, '4': 1, '5': 9, '8': {}, '10': 'parent'}, - {'1': 'name', '3': 2, '4': 1, '5': 9, '8': {}, '9': 0, '10': 'name'}, - { - '1': 'schema', - '3': 3, - '4': 1, - '5': 11, - '6': '.google.pubsub.v1.Schema', - '9': 0, - '10': 'schema' - }, - {'1': 'message', '3': 4, '4': 1, '5': 12, '10': 'message'}, - { - '1': 'encoding', - '3': 5, - '4': 1, - '5': 14, - '6': '.google.pubsub.v1.Encoding', - '10': 'encoding' - }, - ], - '8': [ - {'1': 'schema_spec'}, - ], -}; - -/// Descriptor for `ValidateMessageRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List validateMessageRequestDescriptor = $convert.base64Decode( - 'ChZWYWxpZGF0ZU1lc3NhZ2VSZXF1ZXN0EksKBnBhcmVudBgBIAEoCUIz4EEC+kEtCitjbG91ZH' - 'Jlc291cmNlbWFuYWdlci5nb29nbGVhcGlzLmNvbS9Qcm9qZWN0UgZwYXJlbnQSNwoEbmFtZRgC' - 'IAEoCUIh+kEeChxwdWJzdWIuZ29vZ2xlYXBpcy5jb20vU2NoZW1hSABSBG5hbWUSMgoGc2NoZW' - '1hGAMgASgLMhguZ29vZ2xlLnB1YnN1Yi52MS5TY2hlbWFIAFIGc2NoZW1hEhgKB21lc3NhZ2UY' - 'BCABKAxSB21lc3NhZ2USNgoIZW5jb2RpbmcYBSABKA4yGi5nb29nbGUucHVic3ViLnYxLkVuY2' - '9kaW5nUghlbmNvZGluZ0INCgtzY2hlbWFfc3BlYw=='); - -@$core.Deprecated('Use validateMessageResponseDescriptor instead') -const ValidateMessageResponse$json = { - '1': 'ValidateMessageResponse', -}; - -/// Descriptor for `ValidateMessageResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List validateMessageResponseDescriptor = - $convert.base64Decode('ChdWYWxpZGF0ZU1lc3NhZ2VSZXNwb25zZQ=='); diff --git a/pkgs/google_cloud_pubsub/lib/src/subscription.dart b/pkgs/google_cloud_pubsub/lib/src/subscription.dart index 5e32202e..dabbfe64 100644 --- a/pkgs/google_cloud_pubsub/lib/src/subscription.dart +++ b/pkgs/google_cloud_pubsub/lib/src/subscription.dart @@ -27,22 +27,82 @@ final class Subscription { Subscription._(this.pubsub, this.name); - /// Creates this subscription. + /// Creates a subscription to a given topic. + /// + /// Throws a [SubscriptionAlreadyExistsException] if the subscription already + /// exists. + /// Throws a [TopicNotFoundException] if the corresponding topic doesn't + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.CreateSubscription). Future create({required String topic}) => pubsub.createSubscription(name, topic: topic); - /// Deletes this subscription. - Future delete() => pubsub.deleteSubscription(name); + /// Deletes an existing subscription. + /// + /// All messages retained in the subscription are immediately dropped. + /// + /// Returns `true` if the subscription was deleted, or `false` if the + /// subscription did not exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.DeleteSubscription). + Future delete() => pubsub.deleteSubscription(name); - /// Pulls messages from this subscription. + /// Pulls messages from the server. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Pull). Future> pull({int maxMessages = 1}) => pubsub.pull(name, maxMessages: maxMessages); - /// Acknowledges messages. + /// Establishes a stream with the server, which sends messages down to the + /// client. + /// + /// The client streams acknowledgments and ack deadline modifications + /// back to the server. If an error occurs (including when the server closes + /// the stream with status `UNAVAILABLE` to reassign resources), the stream + /// will throw a [StreamBrokenException]. In this case, the caller should + /// re-establish the stream. Flow control can be achieved by configuring the + /// underlying RPC channel. + /// + /// Throws a [StreamBrokenException] if the stream is broken by the server or + /// network. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.StreamingPull). + Stream streamingPull({int streamAckDeadlineSeconds = 10}) => + pubsub.streamingPull( + name, + streamAckDeadlineSeconds: streamAckDeadlineSeconds, + ); + + /// Acknowledges the messages associated with the `ack_ids`. + /// + /// The Pub/Sub system can remove the relevant messages from the subscription. + /// + /// Acknowledging a message whose ack deadline has expired may succeed, + /// but such a message may be redelivered later. Acknowledging a message more + /// than once will not result in an error. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Acknowledge). Future acknowledge(List ackIds) => pubsub.acknowledge(name, ackIds); - /// Modifies the ack deadline for messages. + /// Modifies the ack deadline for a specific message. + /// + /// This method is useful to indicate that more time is needed to process a + /// message by the subscriber, or to make the message available for redelivery + /// if the processing was interrupted. Note that this does not modify the + /// subscription-level `ackDeadlineSeconds` used for subsequent messages. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.ModifyAckDeadline). Future modifyAckDeadline(List ackIds, int ackDeadlineSeconds) => pubsub.modifyAckDeadline(name, ackIds, ackDeadlineSeconds); } diff --git a/pkgs/google_cloud_pubsub/lib/src/topic.dart b/pkgs/google_cloud_pubsub/lib/src/topic.dart index cb84c0d6..5d9d42c1 100644 --- a/pkgs/google_cloud_pubsub/lib/src/topic.dart +++ b/pkgs/google_cloud_pubsub/lib/src/topic.dart @@ -26,16 +26,34 @@ final class Topic { Topic._(this.pubsub, this.name); - /// Creates this topic. + /// Creates the given topic with the given name. + /// + /// Throws a [TopicAlreadyExistsException] if the topic already exists. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.CreateTopic). Future create() => pubsub.createTopic(name); - /// Deletes this topic. - Future delete() => pubsub.deleteTopic(name); + /// Deletes the topic with the given name. + /// + /// Returns `true` if the topic was deleted, or `false` if the topic did not + /// exist. + /// + /// After a topic is deleted, a new topic may be created with the same name; + /// this is an entirely new topic with none of the old configuration or + /// subscriptions. Existing subscriptions to this topic are not deleted, but + /// their `topic` field is set to `_deleted-topic_`. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.DeleteTopic). + Future delete() => pubsub.deleteTopic(name); - /// Publishes a message to this topic. + /// Adds one or more messages to the topic. + /// + /// Throws a [TopicNotFoundException] if the topic does not exist. /// /// [data] is the message content. /// [attributes] are optional attributes for the message. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.Publish). Future publish(List data, {Map? attributes}) => pubsub.publish(name, data, attributes: attributes); } diff --git a/pkgs/google_cloud_pubsub/protos/google/api/annotations.proto b/pkgs/google_cloud_pubsub/protos/google/api/annotations.proto new file mode 100644 index 00000000..417edd8f --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/api/annotations.proto @@ -0,0 +1,31 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/http.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "AnnotationsProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.MethodOptions { + // See `HttpRule`. + HttpRule http = 72295728; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/api/client.proto b/pkgs/google_cloud_pubsub/protos/google/api/client.proto new file mode 100644 index 00000000..332e0d08 --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/api/client.proto @@ -0,0 +1,598 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/launch_stage.proto"; +import "google/protobuf/descriptor.proto"; +import "google/protobuf/duration.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "ClientProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.MethodOptions { + // A definition of a client library method signature. + // + // In client libraries, each proto RPC corresponds to one or more methods + // which the end user is able to call, and calls the underlying RPC. + // Normally, this method receives a single argument (a struct or instance + // corresponding to the RPC request object). Defining this field will + // add one or more overloads providing flattened or simpler method signatures + // in some languages. + // + // The fields on the method signature are provided as a comma-separated + // string. + // + // For example, the proto RPC and annotation: + // + // rpc CreateSubscription(CreateSubscriptionRequest) + // returns (Subscription) { + // option (google.api.method_signature) = "name,topic"; + // } + // + // Would add the following Java overload (in addition to the method accepting + // the request object): + // + // public final Subscription createSubscription(String name, String topic) + // + // The following backwards-compatibility guidelines apply: + // + // * Adding this annotation to an unannotated method is backwards + // compatible. + // * Adding this annotation to a method which already has existing + // method signature annotations is backwards compatible if and only if + // the new method signature annotation is last in the sequence. + // * Modifying or removing an existing method signature annotation is + // a breaking change. + // * Re-ordering existing method signature annotations is a breaking + // change. + repeated string method_signature = 1051; +} + +extend google.protobuf.ServiceOptions { + // The hostname for this service. + // This should be specified with no prefix or protocol. + // + // Example: + // + // service Foo { + // option (google.api.default_host) = "foo.googleapi.com"; + // ... + // } + string default_host = 1049; + + // OAuth scopes needed for the client. + // + // Example: + // + // service Foo { + // option (google.api.oauth_scopes) = \ + // "https://www.googleapis.com/auth/cloud-platform"; + // ... + // } + // + // If there is more than one scope, use a comma-separated string: + // + // Example: + // + // service Foo { + // option (google.api.oauth_scopes) = \ + // "https://www.googleapis.com/auth/cloud-platform," + // "https://www.googleapis.com/auth/monitoring"; + // ... + // } + string oauth_scopes = 1050; + + // The API version of this service, which should be sent by version-aware + // clients to the service. This allows services to abide by the schema and + // behavior of the service at the time this API version was deployed. + // The format of the API version must be treated as opaque by clients. + // Services may use a format with an apparent structure, but clients must + // not rely on this to determine components within an API version, or attempt + // to construct other valid API versions. Note that this is for upcoming + // functionality and may not be implemented for all services. + // + // Example: + // + // service Foo { + // option (google.api.api_version) = "v1_20230821_preview"; + // } + string api_version = 525000001; +} + +// Required information for every language. +message CommonLanguageSettings { + // Link to automatically generated reference documentation. Example: + // https://cloud.google.com/nodejs/docs/reference/asset/latest + string reference_docs_uri = 1 [deprecated = true]; + + // The destination where API teams want this client library to be published. + repeated ClientLibraryDestination destinations = 2; + + // Configuration for which RPCs should be generated in the GAPIC client. + // + // Note: This field should not be used in most cases. + SelectiveGapicGeneration selective_gapic_generation = 3; +} + +// Details about how and where to publish client libraries. +message ClientLibrarySettings { + // Version of the API to apply these settings to. This is the full protobuf + // package for the API, ending in the version element. + // Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + string version = 1; + + // Launch stage of this version of the API. + LaunchStage launch_stage = 2; + + // When using transport=rest, the client request will encode enums as + // numbers rather than strings. + bool rest_numeric_enums = 3; + + // Settings for legacy Java features, supported in the Service YAML. + JavaSettings java_settings = 21; + + // Settings for C++ client libraries. + CppSettings cpp_settings = 22; + + // Settings for PHP client libraries. + PhpSettings php_settings = 23; + + // Settings for Python client libraries. + PythonSettings python_settings = 24; + + // Settings for Node client libraries. + NodeSettings node_settings = 25; + + // Settings for .NET client libraries. + DotnetSettings dotnet_settings = 26; + + // Settings for Ruby client libraries. + RubySettings ruby_settings = 27; + + // Settings for Go client libraries. + GoSettings go_settings = 28; +} + +// This message configures the settings for publishing [Google Cloud Client +// libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) +// generated from the service config. +message Publishing { + // A list of API method settings, e.g. the behavior for methods that use the + // long-running operation pattern. + repeated MethodSettings method_settings = 2; + + // Link to a *public* URI where users can report issues. Example: + // https://issuetracker.google.com/issues/new?component=190865&template=1161103 + string new_issue_uri = 101; + + // Link to product home page. Example: + // https://cloud.google.com/asset-inventory/docs/overview + string documentation_uri = 102; + + // Used as a tracking tag when collecting data about the APIs developer + // relations artifacts like docs, packages delivered to package managers, + // etc. Example: "speech". + string api_short_name = 103; + + // GitHub label to apply to issues and pull requests opened for this API. + string github_label = 104; + + // GitHub teams to be added to CODEOWNERS in the directory in GitHub + // containing source code for the client libraries for this API. + repeated string codeowner_github_teams = 105; + + // A prefix used in sample code when demarking regions to be included in + // documentation. + string doc_tag_prefix = 106; + + // For whom the client library is being published. + ClientLibraryOrganization organization = 107; + + // Client library settings. If the same version string appears multiple + // times in this list, then the last one wins. Settings from earlier + // settings with the same version string are discarded. + repeated ClientLibrarySettings library_settings = 109; + + // Optional link to proto reference documentation. Example: + // https://cloud.google.com/pubsub/lite/docs/reference/rpc + string proto_reference_documentation_uri = 110; + + // Optional link to REST reference documentation. Example: + // https://cloud.google.com/pubsub/lite/docs/reference/rest + string rest_reference_documentation_uri = 111; +} + +// Settings for Java client libraries. +message JavaSettings { + // The package name to use in Java. Clobbers the java_package option + // set in the protobuf. This should be used **only** by APIs + // who have already set the language_settings.java.package_name" field + // in gapic.yaml. API teams should use the protobuf java_package option + // where possible. + // + // Example of a YAML configuration:: + // + // publishing: + // library_settings: + // java_settings: + // library_package: com.google.cloud.pubsub.v1 + string library_package = 1; + + // Configure the Java class name to use instead of the service's for its + // corresponding generated GAPIC client. Keys are fully-qualified + // service names as they appear in the protobuf (including the full + // the language_settings.java.interface_names" field in gapic.yaml. API + // teams should otherwise use the service name as it appears in the + // protobuf. + // + // Example of a YAML configuration:: + // + // publishing: + // java_settings: + // service_class_names: + // - google.pubsub.v1.Publisher: TopicAdmin + // - google.pubsub.v1.Subscriber: SubscriptionAdmin + map service_class_names = 2; + + // Some settings. + CommonLanguageSettings common = 3; +} + +// Settings for C++ client libraries. +message CppSettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Settings for Php client libraries. +message PhpSettings { + // Some settings. + CommonLanguageSettings common = 1; + + // The package name to use in Php. Clobbers the php_namespace option + // set in the protobuf. This should be used **only** by APIs + // who have already set the language_settings.php.package_name" field + // in gapic.yaml. API teams should use the protobuf php_namespace option + // where possible. + // + // Example of a YAML configuration:: + // + // publishing: + // library_settings: + // php_settings: + // library_package: Google\Cloud\PubSub\V1 + string library_package = 2; +} + +// Settings for Python client libraries. +message PythonSettings { + // Experimental features to be included during client library generation. + // These fields will be deprecated once the feature graduates and is enabled + // by default. + message ExperimentalFeatures { + // Enables generation of asynchronous REST clients if `rest` transport is + // enabled. By default, asynchronous REST clients will not be generated. + // This feature will be enabled by default 1 month after launching the + // feature in preview packages. + bool rest_async_io_enabled = 1; + + // Enables generation of protobuf code using new types that are more + // Pythonic which are included in `protobuf>=5.29.x`. This feature will be + // enabled by default 1 month after launching the feature in preview + // packages. + bool protobuf_pythonic_types_enabled = 2; + + // Disables generation of an unversioned Python package for this client + // library. This means that the module names will need to be versioned in + // import statements. For example `import google.cloud.library_v2` instead + // of `import google.cloud.library`. + bool unversioned_package_disabled = 3; + } + + // Some settings. + CommonLanguageSettings common = 1; + + // Experimental features to be included during client library generation. + ExperimentalFeatures experimental_features = 2; +} + +// Settings for Node client libraries. +message NodeSettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Settings for Dotnet client libraries. +message DotnetSettings { + // Some settings. + CommonLanguageSettings common = 1; + + // Map from original service names to renamed versions. + // This is used when the default generated types + // would cause a naming conflict. (Neither name is + // fully-qualified.) + // Example: Subscriber to SubscriberServiceApi. + map renamed_services = 2; + + // Map from full resource types to the effective short name + // for the resource. This is used when otherwise resource + // named from different services would cause naming collisions. + // Example entry: + // "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + map renamed_resources = 3; + + // List of full resource types to ignore during generation. + // This is typically used for API-specific Location resources, + // which should be handled by the generator as if they were actually + // the common Location resources. + // Example entry: "documentai.googleapis.com/Location" + repeated string ignored_resources = 4; + + // Namespaces which must be aliased in snippets due to + // a known (but non-generator-predictable) naming collision + repeated string forced_namespace_aliases = 5; + + // Method signatures (in the form "service.method(signature)") + // which are provided separately, so shouldn't be generated. + // Snippets *calling* these methods are still generated, however. + repeated string handwritten_signatures = 6; +} + +// Settings for Ruby client libraries. +message RubySettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Settings for Go client libraries. +message GoSettings { + // Some settings. + CommonLanguageSettings common = 1; + + // Map of service names to renamed services. Keys are the package relative + // service names and values are the name to be used for the service client + // and call options. + // + // Example: + // + // publishing: + // go_settings: + // renamed_services: + // Publisher: TopicAdmin + map renamed_services = 2; +} + +// Describes the generator configuration for a method. +message MethodSettings { + // Describes settings to use when generating API methods that use the + // long-running operation pattern. + // All default values below are from those used in the client library + // generators (e.g. + // [Java](https://github.com/googleapis/gapic-generator-java/blob/04c2faa191a9b5a10b92392fe8482279c4404803/src/main/java/com/google/api/generator/gapic/composer/common/RetrySettingsComposer.java)). + message LongRunning { + // Initial delay after which the first poll request will be made. + // Default value: 5 seconds. + google.protobuf.Duration initial_poll_delay = 1; + + // Multiplier to gradually increase delay between subsequent polls until it + // reaches max_poll_delay. + // Default value: 1.5. + float poll_delay_multiplier = 2; + + // Maximum time between two subsequent poll requests. + // Default value: 45 seconds. + google.protobuf.Duration max_poll_delay = 3; + + // Total polling timeout. + // Default value: 5 minutes. + google.protobuf.Duration total_poll_timeout = 4; + } + + // The fully qualified name of the method, for which the options below apply. + // This is used to find the method to apply the options. + // + // Example: + // + // publishing: + // method_settings: + // - selector: google.storage.control.v2.StorageControl.CreateFolder + // # method settings for CreateFolder... + string selector = 1; + + // Describes settings to use for long-running operations when generating + // API methods for RPCs. Complements RPCs that use the annotations in + // google/longrunning/operations.proto. + // + // Example of a YAML configuration:: + // + // publishing: + // method_settings: + // - selector: google.cloud.speech.v2.Speech.BatchRecognize + // long_running: + // initial_poll_delay: 60s # 1 minute + // poll_delay_multiplier: 1.5 + // max_poll_delay: 360s # 6 minutes + // total_poll_timeout: 54000s # 90 minutes + LongRunning long_running = 2; + + // List of top-level fields of the request message, that should be + // automatically populated by the client libraries based on their + // (google.api.field_info).format. Currently supported format: UUID4. + // + // Example of a YAML configuration: + // + // publishing: + // method_settings: + // - selector: google.example.v1.ExampleService.CreateExample + // auto_populated_fields: + // - request_id + repeated string auto_populated_fields = 3; + + // Batching configuration for an API method in client libraries. + // + // Example of a YAML configuration: + // + // publishing: + // method_settings: + // - selector: google.example.v1.ExampleService.BatchCreateExample + // batching: + // element_count_threshold: 1000 + // request_byte_threshold: 100000000 + // delay_threshold_millis: 10 + BatchingConfigProto batching = 4; +} + +// The organization for which the client libraries are being published. +// Affects the url where generated docs are published, etc. +enum ClientLibraryOrganization { + // Not useful. + CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED = 0; + + // Google Cloud Platform Org. + CLOUD = 1; + + // Ads (Advertising) Org. + ADS = 2; + + // Photos Org. + PHOTOS = 3; + + // Street View Org. + STREET_VIEW = 4; + + // Shopping Org. + SHOPPING = 5; + + // Geo Org. + GEO = 6; + + // Generative AI - https://developers.generativeai.google + GENERATIVE_AI = 7; +} + +// To where should client libraries be published? +enum ClientLibraryDestination { + // Client libraries will neither be generated nor published to package + // managers. + CLIENT_LIBRARY_DESTINATION_UNSPECIFIED = 0; + + // Generate the client library in a repo under github.com/googleapis, + // but don't publish it to package managers. + GITHUB = 10; + + // Publish the library to package managers like nuget.org and npmjs.com. + PACKAGE_MANAGER = 20; +} + +// This message is used to configure the generation of a subset of the RPCs in +// a service for client libraries. +// +// Note: This feature should not be used in most cases. +message SelectiveGapicGeneration { + // An allowlist of the fully qualified names of RPCs that should be included + // on public client surfaces. + repeated string methods = 1; + + // Setting this to true indicates to the client generators that methods + // that would be excluded from the generation should instead be generated + // in a way that indicates these methods should not be consumed by + // end users. How this is expressed is up to individual language + // implementations to decide. Some examples may be: added annotations, + // obfuscated identifiers, or other language idiomatic patterns. + bool generate_omitted_as_internal = 2; +} + +// `BatchingConfigProto` defines the batching configuration for an API method. +message BatchingConfigProto { + // The thresholds which trigger a batched request to be sent. + BatchingSettingsProto thresholds = 1; + + // The request and response fields used in batching. + BatchingDescriptorProto batch_descriptor = 2; +} + +// `BatchingSettingsProto` specifies a set of batching thresholds, each of +// which acts as a trigger to send a batch of messages as a request. At least +// one threshold must be positive nonzero. +message BatchingSettingsProto { + // The number of elements of a field collected into a batch which, if + // exceeded, causes the batch to be sent. + int32 element_count_threshold = 1; + + // The aggregated size of the batched field which, if exceeded, causes the + // batch to be sent. This size is computed by aggregating the sizes of the + // request field to be batched, not of the entire request message. + int64 request_byte_threshold = 2; + + // The duration after which a batch should be sent, starting from the addition + // of the first message to that batch. + google.protobuf.Duration delay_threshold = 3; + + // The maximum number of elements collected in a batch that could be accepted + // by server. + int32 element_count_limit = 4; + + // The maximum size of the request that could be accepted by server. + int32 request_byte_limit = 5; + + // The maximum number of elements allowed by flow control. + int32 flow_control_element_limit = 6; + + // The maximum size of data allowed by flow control. + int32 flow_control_byte_limit = 7; + + // The behavior to take when the flow control limit is exceeded. + FlowControlLimitExceededBehaviorProto flow_control_limit_exceeded_behavior = + 8; +} + +// The behavior to take when the flow control limit is exceeded. +enum FlowControlLimitExceededBehaviorProto { + // Default behavior, system-defined. + UNSET_BEHAVIOR = 0; + + // Stop operation, raise error. + THROW_EXCEPTION = 1; + + // Pause operation until limit clears. + BLOCK = 2; + + // Continue operation, disregard limit. + IGNORE = 3; +} + +// `BatchingDescriptorProto` specifies the fields of the request message to be +// used for batching, and, optionally, the fields of the response message to be +// used for demultiplexing. +message BatchingDescriptorProto { + // The repeated field in the request message to be aggregated by batching. + string batched_field = 1; + + // A list of the fields in the request message. Two requests will be batched + // together only if the values of every field specified in + // `request_discriminator_fields` is equal between the two requests. + repeated string discriminator_fields = 2; + + // Optional. When present, indicates the field in the response message to be + // used to demultiplex the response into multiple response messages, in + // correspondence with the multiple request messages originally batched + // together. + string subresponse_field = 3; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/api/field_behavior.proto b/pkgs/google_cloud_pubsub/protos/google/api/field_behavior.proto new file mode 100644 index 00000000..861f8254 --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/api/field_behavior.proto @@ -0,0 +1,104 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "FieldBehaviorProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.FieldOptions { + // A designation of a specific field behavior (required, output only, etc.) + // in protobuf messages. + // + // Examples: + // + // string name = 1 [(google.api.field_behavior) = REQUIRED]; + // State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // google.protobuf.Duration ttl = 1 + // [(google.api.field_behavior) = INPUT_ONLY]; + // google.protobuf.Timestamp expire_time = 1 + // [(google.api.field_behavior) = OUTPUT_ONLY, + // (google.api.field_behavior) = IMMUTABLE]; + repeated google.api.FieldBehavior field_behavior = 1052 [packed = false]; +} + +// An indicator of the behavior of a given field (for example, that a field +// is required in requests, or given as output but ignored as input). +// This **does not** change the behavior in protocol buffers itself; it only +// denotes the behavior and may affect how API tooling handles the field. +// +// Note: This enum **may** receive new values in the future. +enum FieldBehavior { + // Conventional default for enums. Do not use this. + FIELD_BEHAVIOR_UNSPECIFIED = 0; + + // Specifically denotes a field as optional. + // While all fields in protocol buffers are optional, this may be specified + // for emphasis if appropriate. + OPTIONAL = 1; + + // Denotes a field as required. + // This indicates that the field **must** be provided as part of the request, + // and failure to do so will cause an error (usually `INVALID_ARGUMENT`). + REQUIRED = 2; + + // Denotes a field as output only. + // This indicates that the field is provided in responses, but including the + // field in a request does nothing (the server *must* ignore it and + // *must not* throw an error as a result of the field's presence). + OUTPUT_ONLY = 3; + + // Denotes a field as input only. + // This indicates that the field is provided in requests, and the + // corresponding field is not included in output. + INPUT_ONLY = 4; + + // Denotes a field as immutable. + // This indicates that the field may be set once in a request to create a + // resource, but may not be changed thereafter. + IMMUTABLE = 5; + + // Denotes that a (repeated) field is an unordered list. + // This indicates that the service may provide the elements of the list + // in any arbitrary order, rather than the order the user originally + // provided. Additionally, the list's order may or may not be stable. + UNORDERED_LIST = 6; + + // Denotes that this field returns a non-empty default value if not set. + // This indicates that if the user provides the empty value in a request, + // a non-empty value will be returned. The user will not be aware of what + // non-empty value to expect. + NON_EMPTY_DEFAULT = 7; + + // Denotes that the field in a resource (a message annotated with + // google.api.resource) is used in the resource name to uniquely identify the + // resource. For AIP-compliant APIs, this should only be applied to the + // `name` field on the resource. + // + // This behavior should not be applied to references to other resources within + // the message. + // + // The identifier field of resources often have different field behavior + // depending on the request it is embedded in (e.g. for Create methods name + // is optional and unused, while for Update methods it is required). Instead + // of method-specific annotations, only `IDENTIFIER` is required. + IDENTIFIER = 8; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/api/http.proto b/pkgs/google_cloud_pubsub/protos/google/api/http.proto new file mode 100644 index 00000000..bb3af8e5 --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/api/http.proto @@ -0,0 +1,370 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "HttpProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Defines the HTTP configuration for an API service. It contains a list of +// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method +// to one or more HTTP REST API methods. +message Http { + // A list of HTTP configuration rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated HttpRule rules = 1; + + // When set to true, URL path parameters will be fully URI-decoded except in + // cases of single segment matches in reserved expansion, where "%2F" will be + // left encoded. + // + // The default behavior is to not decode RFC 6570 reserved characters in multi + // segment matches. + bool fully_decode_reserved_expansion = 2; +} + +// gRPC Transcoding +// +// gRPC Transcoding is a feature for mapping between a gRPC method and one or +// more HTTP REST endpoints. It allows developers to build a single API service +// that supports both gRPC APIs and REST APIs. Many systems, including [Google +// APIs](https://github.com/googleapis/googleapis), +// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC +// Gateway](https://github.com/grpc-ecosystem/grpc-gateway), +// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature +// and use it for large scale production services. +// +// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies +// how different portions of the gRPC request message are mapped to the URL +// path, URL query parameters, and HTTP request body. It also controls how the +// gRPC response message is mapped to the HTTP response body. `HttpRule` is +// typically specified as an `google.api.http` annotation on the gRPC method. +// +// Each mapping specifies a URL path template and an HTTP method. The path +// template may refer to one or more fields in the gRPC request message, as long +// as each field is a non-repeated field with a primitive (non-message) type. +// The path template controls how fields of the request message are mapped to +// the URL path. +// +// Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/{name=messages/*}" +// }; +// } +// } +// message GetMessageRequest { +// string name = 1; // Mapped to URL path. +// } +// message Message { +// string text = 1; // The resource content. +// } +// +// This enables an HTTP REST to gRPC mapping as below: +// +// - HTTP: `GET /v1/messages/123456` +// - gRPC: `GetMessage(name: "messages/123456")` +// +// Any fields in the request message which are not bound by the path template +// automatically become HTTP query parameters if there is no HTTP request body. +// For example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get:"/v1/messages/{message_id}" +// }; +// } +// } +// message GetMessageRequest { +// message SubMessage { +// string subfield = 1; +// } +// string message_id = 1; // Mapped to URL path. +// int64 revision = 2; // Mapped to URL query parameter `revision`. +// SubMessage sub = 3; // Mapped to URL query parameter `sub.subfield`. +// } +// +// This enables a HTTP JSON to RPC mapping as below: +// +// - HTTP: `GET /v1/messages/123456?revision=2&sub.subfield=foo` +// - gRPC: `GetMessage(message_id: "123456" revision: 2 sub: +// SubMessage(subfield: "foo"))` +// +// Note that fields which are mapped to URL query parameters must have a +// primitive type or a repeated primitive type or a non-repeated message type. +// In the case of a repeated type, the parameter can be repeated in the URL +// as `...?param=A¶m=B`. In the case of a message type, each field of the +// message is mapped to a separate parameter, such as +// `...?foo.a=A&foo.b=B&foo.c=C`. +// +// For HTTP methods that allow a request body, the `body` field +// specifies the mapping. Consider a REST update method on the +// message resource collection: +// +// service Messaging { +// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "message" +// }; +// } +// } +// message UpdateMessageRequest { +// string message_id = 1; // mapped to the URL +// Message message = 2; // mapped to the body +// } +// +// The following HTTP JSON to RPC mapping is enabled, where the +// representation of the JSON in the request body is determined by +// protos JSON encoding: +// +// - HTTP: `PATCH /v1/messages/123456 { "text": "Hi!" }` +// - gRPC: `UpdateMessage(message_id: "123456" message { text: "Hi!" })` +// +// The special name `*` can be used in the body mapping to define that +// every field not bound by the path template should be mapped to the +// request body. This enables the following alternative definition of +// the update method: +// +// service Messaging { +// rpc UpdateMessage(Message) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "*" +// }; +// } +// } +// message Message { +// string message_id = 1; +// string text = 2; +// } +// +// +// The following HTTP JSON to RPC mapping is enabled: +// +// - HTTP: `PATCH /v1/messages/123456 { "text": "Hi!" }` +// - gRPC: `UpdateMessage(message_id: "123456" text: "Hi!")` +// +// Note that when using `*` in the body mapping, it is not possible to +// have HTTP parameters, as all fields not bound by the path end in +// the body. This makes this option more rarely used in practice when +// defining REST APIs. The common usage of `*` is in custom methods +// which don't use the URL at all for transferring data. +// +// It is possible to define multiple HTTP methods for one RPC by using +// the `additional_bindings` option. Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/messages/{message_id}" +// additional_bindings { +// get: "/v1/users/{user_id}/messages/{message_id}" +// } +// }; +// } +// } +// message GetMessageRequest { +// string message_id = 1; +// string user_id = 2; +// } +// +// This enables the following two alternative HTTP JSON to RPC mappings: +// +// - HTTP: `GET /v1/messages/123456` +// - gRPC: `GetMessage(message_id: "123456")` +// +// - HTTP: `GET /v1/users/me/messages/123456` +// - gRPC: `GetMessage(user_id: "me" message_id: "123456")` +// +// Rules for HTTP mapping +// +// 1. Leaf request fields (recursive expansion nested messages in the request +// message) are classified into three categories: +// - Fields referred by the path template. They are passed via the URL path. +// - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They +// are passed via the HTTP +// request body. +// - All other fields are passed via the URL query parameters, and the +// parameter name is the field path in the request message. A repeated +// field can be represented as multiple query parameters under the same +// name. +// 2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL +// query parameter, all fields +// are passed via URL path and HTTP request body. +// 3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP +// request body, all +// fields are passed via URL path and URL query parameters. +// +// Path template syntax +// +// Template = "/" Segments [ Verb ] ; +// Segments = Segment { "/" Segment } ; +// Segment = "*" | "**" | LITERAL | Variable ; +// Variable = "{" FieldPath [ "=" Segments ] "}" ; +// FieldPath = IDENT { "." IDENT } ; +// Verb = ":" LITERAL ; +// +// The syntax `*` matches a single URL path segment. The syntax `**` matches +// zero or more URL path segments, which must be the last part of the URL path +// except the `Verb`. +// +// The syntax `Variable` matches part of the URL path as specified by its +// template. A variable template must not contain other variables. If a variable +// matches a single path segment, its template may be omitted, e.g. `{var}` +// is equivalent to `{var=*}`. +// +// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL` +// contains any reserved character, such characters should be percent-encoded +// before the matching. +// +// If a variable contains exactly one path segment, such as `"{var}"` or +// `"{var=*}"`, when such a variable is expanded into a URL path on the client +// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The +// server side does the reverse decoding. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{var}`. +// +// If a variable contains multiple path segments, such as `"{var=foo/*}"` +// or `"{var=**}"`, when such a variable is expanded into a URL path on the +// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. +// The server side does the reverse decoding, except "%2F" and "%2f" are left +// unchanged. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{+var}`. +// +// Using gRPC API Service Configuration +// +// gRPC API Service Configuration (service config) is a configuration language +// for configuring a gRPC service to become a user-facing product. The +// service config is simply the YAML representation of the `google.api.Service` +// proto message. +// +// As an alternative to annotating your proto file, you can configure gRPC +// transcoding in your service config YAML files. You do this by specifying a +// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same +// effect as the proto annotation. This can be particularly useful if you +// have a proto that is reused in multiple services. Note that any transcoding +// specified in the service config will override any matching transcoding +// configuration in the proto. +// +// The following example selects a gRPC method and applies an `HttpRule` to it: +// +// http: +// rules: +// - selector: example.v1.Messaging.GetMessage +// get: /v1/messages/{message_id}/{sub.subfield} +// +// Special notes +// +// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the +// proto to JSON conversion must follow the [proto3 +// specification](https://developers.google.com/protocol-buffers/docs/proto3#json). +// +// While the single segment variable follows the semantics of +// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String +// Expansion, the multi segment variable **does not** follow RFC 6570 Section +// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion +// does not expand special characters like `?` and `#`, which would lead +// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding +// for multi segment variables. +// +// The path variables **must not** refer to any repeated or mapped field, +// because client libraries are not capable of handling such variable expansion. +// +// The path variables **must not** capture the leading "/" character. The reason +// is that the most common use case "{var}" does not capture the leading "/" +// character. For consistency, all path variables must share the same behavior. +// +// Repeated message fields must not be mapped to URL query parameters, because +// no client library can support such complicated mapping. +// +// If an API needs to use a JSON array for request or response body, it can map +// the request or response body to a repeated field. However, some gRPC +// Transcoding implementations may not support this feature. +message HttpRule { + // Selects a method to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // Determines the URL pattern is matched by this rules. This pattern can be + // used with any of the {get|put|post|delete|patch} methods. A custom method + // can be defined using the 'custom' field. + oneof pattern { + // Maps to HTTP GET. Used for listing and getting information about + // resources. + string get = 2; + + // Maps to HTTP PUT. Used for replacing a resource. + string put = 3; + + // Maps to HTTP POST. Used for creating a resource or performing an action. + string post = 4; + + // Maps to HTTP DELETE. Used for deleting a resource. + string delete = 5; + + // Maps to HTTP PATCH. Used for updating a resource. + string patch = 6; + + // The custom pattern is used for specifying an HTTP method that is not + // included in the `pattern` field, such as HEAD, or "*" to leave the + // HTTP method unspecified for this rule. The wild-card rule is useful + // for services that provide content to Web (HTML) clients. + CustomHttpPattern custom = 8; + } + + // The name of the request field whose value is mapped to the HTTP request + // body, or `*` for mapping all request fields not captured by the path + // pattern to the HTTP body, or omitted for not having any HTTP request body. + // + // NOTE: the referred field must be present at the top-level of the request + // message type. + string body = 7; + + // Optional. The name of the response field whose value is mapped to the HTTP + // response body. When omitted, the entire response message will be used + // as the HTTP response body. + // + // NOTE: The referred field must be present at the top-level of the response + // message type. + string response_body = 12; + + // Additional HTTP bindings for the selector. Nested bindings must + // not contain an `additional_bindings` field themselves (that is, + // the nesting may only be one level deep). + repeated HttpRule additional_bindings = 11; +} + +// A custom pattern is used for defining custom HTTP verb. +message CustomHttpPattern { + // The name of this custom HTTP verb. + string kind = 1; + + // The path matched by this custom verb. + string path = 2; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/api/launch_stage.proto b/pkgs/google_cloud_pubsub/protos/google/api/launch_stage.proto new file mode 100644 index 00000000..0fff247b --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/api/launch_stage.proto @@ -0,0 +1,72 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api;api"; +option java_multiple_files = true; +option java_outer_classname = "LaunchStageProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// The launch stage as defined by [Google Cloud Platform +// Launch Stages](https://cloud.google.com/terms/launch-stages). +enum LaunchStage { + // Do not use this default value. + LAUNCH_STAGE_UNSPECIFIED = 0; + + // The feature is not yet implemented. Users can not use it. + UNIMPLEMENTED = 6; + + // Prelaunch features are hidden from users and are only visible internally. + PRELAUNCH = 7; + + // Early Access features are limited to a closed group of testers. To use + // these features, you must sign up in advance and sign a Trusted Tester + // agreement (which includes confidentiality provisions). These features may + // be unstable, changed in backward-incompatible ways, and are not + // guaranteed to be released. + EARLY_ACCESS = 1; + + // Alpha is a limited availability test for releases before they are cleared + // for widespread use. By Alpha, all significant design issues are resolved + // and we are in the process of verifying functionality. Alpha customers + // need to apply for access, agree to applicable terms, and have their + // projects allowlisted. Alpha releases don't have to be feature complete, + // no SLAs are provided, and there are no technical support obligations, but + // they will be far enough along that customers can actually use them in + // test environments or for limited-use tests -- just like they would in + // normal production cases. + ALPHA = 2; + + // Beta is the point at which we are ready to open a release for any + // customer to use. There are no SLA or technical support obligations in a + // Beta release. Products will be complete from a feature perspective, but + // may have some open outstanding issues. Beta releases are suitable for + // limited production use cases. + BETA = 3; + + // GA features are open to all developers and are considered stable and + // fully qualified for production use. + GA = 4; + + // Deprecated features are scheduled to be shut down and removed. For more + // information, see the "Deprecation Policy" section of our [Terms of + // Service](https://cloud.google.com/terms/) + // and the [Google Cloud Platform Subject to the Deprecation + // Policy](https://cloud.google.com/terms/deprecation) documentation. + DEPRECATED = 5; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/api/resource.proto b/pkgs/google_cloud_pubsub/protos/google/api/resource.proto new file mode 100644 index 00000000..2a5213bb --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/api/resource.proto @@ -0,0 +1,242 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "ResourceProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.FieldOptions { + // An annotation that describes a resource reference, see + // [ResourceReference][]. + google.api.ResourceReference resource_reference = 1055; +} + +extend google.protobuf.FileOptions { + // An annotation that describes a resource definition without a corresponding + // message; see [ResourceDescriptor][]. + repeated google.api.ResourceDescriptor resource_definition = 1053; +} + +extend google.protobuf.MessageOptions { + // An annotation that describes a resource definition, see + // [ResourceDescriptor][]. + google.api.ResourceDescriptor resource = 1053; +} + +// A simple descriptor of a resource type. +// +// ResourceDescriptor annotates a resource message (either by means of a +// protobuf annotation or use in the service config), and associates the +// resource's schema, the resource type, and the pattern of the resource name. +// +// Example: +// +// message Topic { +// // Indicates this message defines a resource schema. +// // Declares the resource type in the format of {service}/{kind}. +// // For Kubernetes resources, the format is {api group}/{kind}. +// option (google.api.resource) = { +// type: "pubsub.googleapis.com/Topic" +// pattern: "projects/{project}/topics/{topic}" +// }; +// } +// +// The ResourceDescriptor Yaml config will look like: +// +// resources: +// - type: "pubsub.googleapis.com/Topic" +// pattern: "projects/{project}/topics/{topic}" +// +// Sometimes, resources have multiple patterns, typically because they can +// live under multiple parents. +// +// Example: +// +// message LogEntry { +// option (google.api.resource) = { +// type: "logging.googleapis.com/LogEntry" +// pattern: "projects/{project}/logs/{log}" +// pattern: "folders/{folder}/logs/{log}" +// pattern: "organizations/{organization}/logs/{log}" +// pattern: "billingAccounts/{billing_account}/logs/{log}" +// }; +// } +// +// The ResourceDescriptor Yaml config will look like: +// +// resources: +// - type: 'logging.googleapis.com/LogEntry' +// pattern: "projects/{project}/logs/{log}" +// pattern: "folders/{folder}/logs/{log}" +// pattern: "organizations/{organization}/logs/{log}" +// pattern: "billingAccounts/{billing_account}/logs/{log}" +message ResourceDescriptor { + // A description of the historical or future-looking state of the + // resource pattern. + enum History { + // The "unset" value. + HISTORY_UNSPECIFIED = 0; + + // The resource originally had one pattern and launched as such, and + // additional patterns were added later. + ORIGINALLY_SINGLE_PATTERN = 1; + + // The resource has one pattern, but the API owner expects to add more + // later. (This is the inverse of ORIGINALLY_SINGLE_PATTERN, and prevents + // that from being necessary once there are multiple patterns.) + FUTURE_MULTI_PATTERN = 2; + } + + // A flag representing a specific style that a resource claims to conform to. + enum Style { + // The unspecified value. Do not use. + STYLE_UNSPECIFIED = 0; + + // This resource is intended to be "declarative-friendly". + // + // Declarative-friendly resources must be more strictly consistent, and + // setting this to true communicates to tools that this resource should + // adhere to declarative-friendly expectations. + // + // Note: This is used by the API linter (linter.aip.dev) to enable + // additional checks. + DECLARATIVE_FRIENDLY = 1; + } + + // The resource type. It must be in the format of + // {service_name}/{resource_type_kind}. The `resource_type_kind` must be + // singular and must not include version numbers. + // + // Example: `storage.googleapis.com/Bucket` + // + // The value of the resource_type_kind must follow the regular expression + // /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and + // should use PascalCase (UpperCamelCase). The maximum number of + // characters allowed for the `resource_type_kind` is 100. + string type = 1; + + // Optional. The relative resource name pattern associated with this resource + // type. The DNS prefix of the full resource name shouldn't be specified here. + // + // The path pattern must follow the syntax, which aligns with HTTP binding + // syntax: + // + // Template = Segment { "/" Segment } ; + // Segment = LITERAL | Variable ; + // Variable = "{" LITERAL "}" ; + // + // Examples: + // + // - "projects/{project}/topics/{topic}" + // - "projects/{project}/knowledgeBases/{knowledge_base}" + // + // The components in braces correspond to the IDs for each resource in the + // hierarchy. It is expected that, if multiple patterns are provided, + // the same component name (e.g. "project") refers to IDs of the same + // type of resource. + repeated string pattern = 2; + + // Optional. The field on the resource that designates the resource name + // field. If omitted, this is assumed to be "name". + string name_field = 3; + + // Optional. The historical or future-looking state of the resource pattern. + // + // Example: + // + // // The InspectTemplate message originally only supported resource + // // names with organization, and project was added later. + // message InspectTemplate { + // option (google.api.resource) = { + // type: "dlp.googleapis.com/InspectTemplate" + // pattern: + // "organizations/{organization}/inspectTemplates/{inspect_template}" + // pattern: "projects/{project}/inspectTemplates/{inspect_template}" + // history: ORIGINALLY_SINGLE_PATTERN + // }; + // } + History history = 4; + + // The plural name used in the resource name and permission names, such as + // 'projects' for the resource name of 'projects/{project}' and the permission + // name of 'cloudresourcemanager.googleapis.com/projects.get'. One exception + // to this is for Nested Collections that have stuttering names, as defined + // in [AIP-122](https://google.aip.dev/122#nested-collections), where the + // collection ID in the resource name pattern does not necessarily directly + // match the `plural` value. + // + // It is the same concept of the `plural` field in k8s CRD spec + // https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + // + // Note: The plural form is required even for singleton resources. See + // https://aip.dev/156 + string plural = 5; + + // The same concept of the `singular` field in k8s CRD spec + // https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + // Such as "project" for the `resourcemanager.googleapis.com/Project` type. + string singular = 6; + + // Style flag(s) for this resource. + // These indicate that a resource is expected to conform to a given + // style. See the specific style flags for additional information. + repeated Style style = 10; +} + +// Defines a proto annotation that describes a string field that refers to +// an API resource. +message ResourceReference { + // The resource type that the annotated field references. + // + // Example: + // + // message Subscription { + // string topic = 2 [(google.api.resource_reference) = { + // type: "pubsub.googleapis.com/Topic" + // }]; + // } + // + // Occasionally, a field may reference an arbitrary resource. In this case, + // APIs use the special value * in their resource reference. + // + // Example: + // + // message GetIamPolicyRequest { + // string resource = 2 [(google.api.resource_reference) = { + // type: "*" + // }]; + // } + string type = 1; + + // The resource type of a child collection that the annotated field + // references. This is useful for annotating the `parent` field that + // doesn't have a fixed resource type. + // + // Example: + // + // message ListLogEntriesRequest { + // string parent = 1 [(google.api.resource_reference) = { + // child_type: "logging.googleapis.com/LogEntry" + // }; + // } + string child_type = 2; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/protobuf/duration.proto b/pkgs/google_cloud_pubsub/protos/google/protobuf/duration.proto new file mode 100644 index 00000000..41f40c22 --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/protobuf/duration.proto @@ -0,0 +1,115 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/durationpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DurationProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (duration.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +message Duration { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + int64 seconds = 1; + + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + int32 nanos = 2; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/protobuf/empty.proto b/pkgs/google_cloud_pubsub/protos/google/protobuf/empty.proto new file mode 100644 index 00000000..b87c89dc --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/protobuf/empty.proto @@ -0,0 +1,51 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option go_package = "google.golang.org/protobuf/types/known/emptypb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "EmptyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +message Empty {} diff --git a/pkgs/google_cloud_pubsub/protos/google/protobuf/field_mask.proto b/pkgs/google_cloud_pubsub/protos/google/protobuf/field_mask.proto new file mode 100644 index 00000000..7093fba5 --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/protobuf/field_mask.proto @@ -0,0 +1,243 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option java_package = "com.google.protobuf"; +option java_outer_classname = "FieldMaskProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "google.golang.org/protobuf/types/known/fieldmaskpb"; +option cc_enable_arenas = true; + +// `FieldMask` represents a set of symbolic field paths, for example: +// +// paths: "f.a" +// paths: "f.b.d" +// +// Here `f` represents a field in some root message, `a` and `b` +// fields in the message found in `f`, and `d` a field found in the +// message in `f.b`. +// +// Field masks are used to specify a subset of fields that should be +// returned by a get operation or modified by an update operation. +// Field masks also have a custom JSON encoding (see below). +// +// # Field Masks in Projections +// +// When used in the context of a projection, a response message or +// sub-message is filtered by the API to only contain those fields as +// specified in the mask. For example, if the mask in the previous +// example is applied to a response message as follows: +// +// f { +// a : 22 +// b { +// d : 1 +// x : 2 +// } +// y : 13 +// } +// z: 8 +// +// The result will not contain specific values for fields x,y and z +// (their value will be set to the default, and omitted in proto text +// output): +// +// +// f { +// a : 22 +// b { +// d : 1 +// } +// } +// +// A repeated field is not allowed except at the last position of a +// paths string. +// +// If a FieldMask object is not present in a get operation, the +// operation applies to all fields (as if a FieldMask of all fields +// had been specified). +// +// Note that a field mask does not necessarily apply to the +// top-level response message. In case of a REST get operation, the +// field mask applies directly to the response, but in case of a REST +// list operation, the mask instead applies to each individual message +// in the returned resource list. In case of a REST custom method, +// other definitions may be used. Where the mask applies will be +// clearly documented together with its declaration in the API. In +// any case, the effect on the returned resource/resources is required +// behavior for APIs. +// +// # Field Masks in Update Operations +// +// A field mask in update operations specifies which fields of the +// targeted resource are going to be updated. The API is required +// to only change the values of the fields as specified in the mask +// and leave the others untouched. If a resource is passed in to +// describe the updated values, the API ignores the values of all +// fields not covered by the mask. +// +// If a repeated field is specified for an update operation, new values will +// be appended to the existing repeated field in the target resource. Note that +// a repeated field is only allowed in the last position of a `paths` string. +// +// If a sub-message is specified in the last position of the field mask for an +// update operation, then new value will be merged into the existing sub-message +// in the target resource. +// +// For example, given the target message: +// +// f { +// b { +// d: 1 +// x: 2 +// } +// c: [1] +// } +// +// And an update message: +// +// f { +// b { +// d: 10 +// } +// c: [2] +// } +// +// then if the field mask is: +// +// paths: ["f.b", "f.c"] +// +// then the result will be: +// +// f { +// b { +// d: 10 +// x: 2 +// } +// c: [1, 2] +// } +// +// An implementation may provide options to override this default behavior for +// repeated and message fields. +// +// Note that libraries which implement FieldMask resolution have various +// different behaviors in the face of empty masks or the special "*" mask. +// When implementing a service you should confirm these cases have the +// appropriate behavior in the underlying FieldMask library that you desire, +// and you may need to special case those cases in your application code if +// the underlying field mask library behavior differs from your intended +// service semantics. +// +// Update methods implementing https://google.aip.dev/134 +// - MUST support the special value * meaning "full replace" +// - MUST treat an omitted field mask as "replace fields which are present". +// +// Other methods implementing https://google.aip.dev/157 +// - SHOULD support the special value "*" to mean "get all". +// - MUST treat an omitted field mask to mean "get all", unless otherwise +// documented. +// +// ## Considerations for HTTP REST +// +// The HTTP kind of an update operation which uses a field mask must +// be set to PATCH instead of PUT in order to satisfy HTTP semantics +// (PUT must only be used for full updates). +// +// # JSON Encoding of Field Masks +// +// In JSON, a field mask is encoded as a single string where paths are +// separated by a comma. Fields name in each path are converted +// to/from lower-camel naming conventions. +// +// As an example, consider the following message declarations: +// +// message Profile { +// User user = 1; +// Photo photo = 2; +// } +// message User { +// string display_name = 1; +// string address = 2; +// } +// +// In proto a field mask for `Profile` may look as such: +// +// mask { +// paths: "user.display_name" +// paths: "photo" +// } +// +// In JSON, the same mask is represented as below: +// +// { +// mask: "user.displayName,photo" +// } +// +// # Field Masks and Oneof Fields +// +// Field masks treat fields in oneofs just as regular fields. Consider the +// following message: +// +// message SampleMessage { +// oneof test_oneof { +// string name = 4; +// SubMessage sub_message = 9; +// } +// } +// +// The field mask can be: +// +// mask { +// paths: "name" +// } +// +// Or: +// +// mask { +// paths: "sub_message" +// } +// +// Note that oneof type names ("test_oneof" in this case) cannot be used in +// paths. +// +// ## Field Mask Verification +// +// The implementation of any API method which has a FieldMask type field in the +// request should verify the included field paths, and return an +// `INVALID_ARGUMENT` error if any path is unmappable. +message FieldMask { + // The set of field mask paths. + repeated string paths = 1; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/protobuf/struct.proto b/pkgs/google_cloud_pubsub/protos/google/protobuf/struct.proto new file mode 100644 index 00000000..a03667da --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/protobuf/struct.proto @@ -0,0 +1,111 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/structpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "StructProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// Represents a JSON object. +// +// An unordered key-value map, intending to perfectly capture the semantics of a +// JSON object. This enables parsing any arbitrary JSON payload as a message +// field in ProtoJSON format. +// +// This follows RFC 8259 guidelines for interoperable JSON: notably this type +// cannot represent large Int64 values or `NaN`/`Infinity` numbers, +// since the JSON format generally does not support those values in its number +// type. +// +// If you do not intend to parse arbitrary JSON into your message, a custom +// typed message should be preferred instead of using this type. +message Struct { + // Unordered map of dynamically typed values. + map fields = 1; +} + +// Represents a JSON value. +// +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of these +// variants. Absence of any variant is an invalid state. +message Value { + // The kind of value. + oneof kind { + // Represents a JSON `null`. + NullValue null_value = 1; + + // Represents a JSON number. Must not be `NaN`, `Infinity` or + // `-Infinity`, since those are not supported in JSON. This also cannot + // represent large Int64 values, since JSON format generally does not + // support them in its number type. + double number_value = 2; + + // Represents a JSON string. + string string_value = 3; + + // Represents a JSON boolean (`true` or `false` literal in JSON). + bool bool_value = 4; + + // Represents a JSON object. + Struct struct_value = 5; + + // Represents a JSON array. + ListValue list_value = 6; + } +} + +// Represents a JSON `null`. +// +// `NullValue` is a sentinel, using an enum with only one value to represent +// the null value for the `Value` type union. +// +// A field of type `NullValue` with any value other than `0` is considered +// invalid. Most ProtoJSON serializers will emit a Value with a `null_value` set +// as a JSON `null` regardless of the integer value, and so will round trip to +// a `0` value. +enum NullValue { + // Null value. + NULL_VALUE = 0; +} + +// Represents a JSON array. +message ListValue { + // Repeated field of dynamically typed values. + repeated Value values = 1; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/protobuf/timestamp.proto b/pkgs/google_cloud_pubsub/protos/google/protobuf/timestamp.proto new file mode 100644 index 00000000..6bc1efc6 --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/protobuf/timestamp.proto @@ -0,0 +1,145 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/timestamppb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "TimestampProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// A Timestamp represents a point in time independent of any time zone or local +// calendar, encoded as a count of seconds and fractions of seconds at +// nanosecond resolution. The count is relative to an epoch at UTC midnight on +// January 1, 1970, in the proleptic Gregorian calendar which extends the +// Gregorian calendar backwards to year one. +// +// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap +// second table is needed for interpretation, using a [24-hour linear +// smear](https://developers.google.com/time/smear). +// +// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By +// restricting to that range, we ensure that we can convert to and from [RFC +// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// Example 5: Compute Timestamp from Java `Instant.now()`. +// +// Instant now = Instant.now(); +// +// Timestamp timestamp = +// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) +// .setNanos(now.getNano()).build(); +// +// Example 6: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A ProtoJSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a ProtoJSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard +// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using +// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with +// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use +// the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() +// ) to obtain a formatter capable of generating timestamps in this format. +// +message Timestamp { + // Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must + // be between -62135596800 and 253402300799 inclusive (which corresponds to + // 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z). + int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. This field is + // the nanosecond portion of the duration, not an alternative to seconds. + // Negative second values with fractions must still have non-negative nanos + // values that count forward in time. Must be between 0 and 999,999,999 + // inclusive. + int32 nanos = 2; +} diff --git a/pkgs/google_cloud_pubsub/protos/google/pubsub/v1/pubsub.proto b/pkgs/google_cloud_pubsub/protos/google/pubsub/v1/pubsub.proto new file mode 100644 index 00000000..382343c6 --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/pubsub/v1/pubsub.proto @@ -0,0 +1,2588 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.pubsub.v1; + +import "google/api/annotations.proto"; +import "google/api/client.proto"; +import "google/api/field_behavior.proto"; +import "google/api/resource.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/field_mask.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; +import "google/pubsub/v1/schema.proto"; + +option csharp_namespace = "Google.Cloud.PubSub.V1"; +option go_package = "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb;pubsubpb"; +option java_multiple_files = true; +option java_outer_classname = "PubsubProto"; +option java_package = "com.google.pubsub.v1"; +option php_namespace = "Google\\Cloud\\PubSub\\V1"; +option ruby_package = "Google::Cloud::PubSub::V1"; +option (google.api.resource_definition) = { + type: "cloudkms.googleapis.com/CryptoKey" + pattern: "projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}" +}; +option (google.api.resource_definition) = { + type: "analyticshub.googleapis.com/Listing" + pattern: "projects/{project}/locations/{location}/dataExchanges/{data_exchange}/listings/{listing}" +}; + +// The service that an application uses to manipulate topics, and to send +// messages to a topic. +service Publisher { + option (google.api.default_host) = "pubsub.googleapis.com"; + option (google.api.oauth_scopes) = + "https://www.googleapis.com/auth/cloud-platform," + "https://www.googleapis.com/auth/pubsub"; + + // Creates the given topic with the given name. See the [resource name rules] + // (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). + rpc CreateTopic(Topic) returns (Topic) { + option (google.api.http) = { + put: "/v1/{name=projects/*/topics/*}" + body: "*" + }; + option (google.api.method_signature) = "name"; + } + + // Updates an existing topic by updating the fields specified in the update + // mask. Note that certain properties of a topic are not modifiable. + rpc UpdateTopic(UpdateTopicRequest) returns (Topic) { + option (google.api.http) = { + patch: "/v1/{topic.name=projects/*/topics/*}" + body: "*" + }; + option (google.api.method_signature) = "topic,update_mask"; + } + + // Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic + // does not exist. + rpc Publish(PublishRequest) returns (PublishResponse) { + option (google.api.http) = { + post: "/v1/{topic=projects/*/topics/*}:publish" + body: "*" + }; + option (google.api.method_signature) = "topic,messages"; + } + + // Gets the configuration of a topic. + rpc GetTopic(GetTopicRequest) returns (Topic) { + option (google.api.http) = { + get: "/v1/{topic=projects/*/topics/*}" + }; + option (google.api.method_signature) = "topic"; + } + + // Lists matching topics. + rpc ListTopics(ListTopicsRequest) returns (ListTopicsResponse) { + option (google.api.http) = { + get: "/v1/{project=projects/*}/topics" + }; + option (google.api.method_signature) = "project"; + } + + // Lists the names of the attached subscriptions on this topic. + rpc ListTopicSubscriptions(ListTopicSubscriptionsRequest) + returns (ListTopicSubscriptionsResponse) { + option (google.api.http) = { + get: "/v1/{topic=projects/*/topics/*}/subscriptions" + }; + option (google.api.method_signature) = "topic"; + } + + // Lists the names of the snapshots on this topic. Snapshots are used in + // [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, + // which allow you to manage message acknowledgments in bulk. That is, you can + // set the acknowledgment state of messages in an existing subscription to the + // state captured by a snapshot. + rpc ListTopicSnapshots(ListTopicSnapshotsRequest) + returns (ListTopicSnapshotsResponse) { + option (google.api.http) = { + get: "/v1/{topic=projects/*/topics/*}/snapshots" + }; + option (google.api.method_signature) = "topic"; + } + + // Deletes the topic with the given name. Returns `NOT_FOUND` if the topic + // does not exist. After a topic is deleted, a new topic may be created with + // the same name; this is an entirely new topic with none of the old + // configuration or subscriptions. Existing subscriptions to this topic are + // not deleted, but their `topic` field is set to `_deleted-topic_`. + rpc DeleteTopic(DeleteTopicRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/v1/{topic=projects/*/topics/*}" + }; + option (google.api.method_signature) = "topic"; + } + + // Detaches a subscription from this topic. All messages retained in the + // subscription are dropped. Subsequent `Pull` and `StreamingPull` requests + // will return FAILED_PRECONDITION. If the subscription is a push + // subscription, pushes to the endpoint will stop. + rpc DetachSubscription(DetachSubscriptionRequest) + returns (DetachSubscriptionResponse) { + option (google.api.http) = { + post: "/v1/{subscription=projects/*/subscriptions/*}:detach" + }; + } +} + +// A policy constraining the storage of messages published to the topic. +message MessageStoragePolicy { + // Optional. A list of IDs of Google Cloud regions where messages that are + // published to the topic may be persisted in storage. Messages published by + // publishers running in non-allowed Google Cloud regions (or running outside + // of Google Cloud altogether) are routed for storage in one of the allowed + // regions. An empty list means that no regions are allowed, and is not a + // valid configuration. + repeated string allowed_persistence_regions = 1 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If true, `allowed_persistence_regions` is also used to enforce + // in-transit guarantees for messages. That is, Pub/Sub will fail + // Publish operations on this topic and subscribe operations + // on any subscription attached to this topic in any region that is + // not in `allowed_persistence_regions`. + bool enforce_in_transit = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// Settings for validating messages published against a schema. +message SchemaSettings { + // Required. The name of the schema that messages published should be + // validated against. Format is `projects/{project}/schemas/{schema}`. The + // value of this field will be `_deleted-schema_` if the schema has been + // deleted. + string schema = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" } + ]; + + // Optional. The encoding of messages validated against `schema`. + Encoding encoding = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The minimum (inclusive) revision allowed for validating messages. + // If empty or not present, allow any revision to be validated against + // last_revision or any revision created before. + string first_revision_id = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The maximum (inclusive) revision allowed for validating messages. + // If empty or not present, allow any revision to be validated against + // first_revision or any revision created after. + string last_revision_id = 4 [(google.api.field_behavior) = OPTIONAL]; +} + +// Settings for an ingestion data source on a topic. +message IngestionDataSourceSettings { + // Ingestion settings for Amazon Kinesis Data Streams. + message AwsKinesis { + // Possible states for ingestion from Amazon Kinesis Data Streams. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // Ingestion is active. + ACTIVE = 1; + + // Permission denied encountered while consuming data from Kinesis. + // This can happen if: + // - The provided `aws_role_arn` does not exist or does not have the + // appropriate permissions attached. + // - The provided `aws_role_arn` is not set up properly for Identity + // Federation using `gcp_service_account`. + // - The Pub/Sub SA is not granted the + // `iam.serviceAccounts.getOpenIdToken` permission on + // `gcp_service_account`. + KINESIS_PERMISSION_DENIED = 2; + + // Permission denied encountered while publishing to the topic. This can + // happen if the Pub/Sub SA has not been granted the [appropriate publish + // permissions](https://cloud.google.com/pubsub/docs/access-control#pubsub.publisher) + PUBLISH_PERMISSION_DENIED = 3; + + // The Kinesis stream does not exist. + STREAM_NOT_FOUND = 4; + + // The Kinesis consumer does not exist. + CONSUMER_NOT_FOUND = 5; + } + + // Output only. An output-only field that indicates the state of the Kinesis + // ingestion source. + State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Required. The Kinesis stream ARN to ingest data from. + string stream_arn = 2 [(google.api.field_behavior) = REQUIRED]; + + // Required. The Kinesis consumer ARN to used for ingestion in Enhanced + // Fan-Out mode. The consumer must be already created and ready to be used. + string consumer_arn = 3 [(google.api.field_behavior) = REQUIRED]; + + // Required. AWS role ARN to be used for Federated Identity authentication + // with Kinesis. Check the Pub/Sub docs for how to set up this role and the + // required permissions that need to be attached to it. + string aws_role_arn = 4 [(google.api.field_behavior) = REQUIRED]; + + // Required. The GCP service account to be used for Federated Identity + // authentication with Kinesis (via a `AssumeRoleWithWebIdentity` call for + // the provided role). The `aws_role_arn` must be set up with + // `accounts.google.com:sub` equals to this service account number. + string gcp_service_account = 5 [(google.api.field_behavior) = REQUIRED]; + } + + // Ingestion settings for Cloud Storage. + message CloudStorage { + // Possible states for ingestion from Cloud Storage. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // Ingestion is active. + ACTIVE = 1; + + // Permission denied encountered while calling the Cloud Storage API. This + // can happen if the Pub/Sub SA has not been granted the + // [appropriate + // permissions](https://cloud.google.com/storage/docs/access-control/iam-permissions): + // - storage.objects.list: to list the objects in a bucket. + // - storage.objects.get: to read the objects in a bucket. + // - storage.buckets.get: to verify the bucket exists. + CLOUD_STORAGE_PERMISSION_DENIED = 2; + + // Permission denied encountered while publishing to the topic. This can + // happen if the Pub/Sub SA has not been granted the [appropriate publish + // permissions](https://cloud.google.com/pubsub/docs/access-control#pubsub.publisher) + PUBLISH_PERMISSION_DENIED = 3; + + // The provided Cloud Storage bucket doesn't exist. + BUCKET_NOT_FOUND = 4; + + // The Cloud Storage bucket has too many objects, ingestion will be + // paused. + TOO_MANY_OBJECTS = 5; + } + + // Configuration for reading Cloud Storage data in text format. Each line of + // text as specified by the delimiter will be set to the `data` field of a + // Pub/Sub message. + message TextFormat { + // Optional. When unset, '\n' is used. + optional string delimiter = 1 [(google.api.field_behavior) = OPTIONAL]; + } + + // Configuration for reading Cloud Storage data in Avro binary format. The + // bytes of each object will be set to the `data` field of a Pub/Sub + // message. + message AvroFormat {} + + // Configuration for reading Cloud Storage data written via [Cloud Storage + // subscriptions](https://cloud.google.com/pubsub/docs/cloudstorage). The + // data and attributes fields of the originally exported Pub/Sub message + // will be restored when publishing. + message PubSubAvroFormat {} + + // Output only. An output-only field that indicates the state of the Cloud + // Storage ingestion source. + State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Optional. Cloud Storage bucket. The bucket name must be without any + // prefix like "gs://". See the [bucket naming requirements] + // (https://cloud.google.com/storage/docs/buckets#naming). + string bucket = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Defaults to text format. + oneof input_format { + // Optional. Data from Cloud Storage will be interpreted as text. + TextFormat text_format = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Data from Cloud Storage will be interpreted in Avro format. + AvroFormat avro_format = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. It will be assumed data from Cloud Storage was written via + // [Cloud Storage + // subscriptions](https://cloud.google.com/pubsub/docs/cloudstorage). + PubSubAvroFormat pubsub_avro_format = 5 + [(google.api.field_behavior) = OPTIONAL]; + } + + // Optional. Only objects with a larger or equal creation timestamp will be + // ingested. + google.protobuf.Timestamp minimum_object_create_time = 6 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Glob pattern used to match objects that will be ingested. If + // unset, all objects will be ingested. See the [supported + // patterns](https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-objects-and-prefixes-using-glob). + string match_glob = 9 [(google.api.field_behavior) = OPTIONAL]; + } + + // Ingestion settings for Azure Event Hubs. + message AzureEventHubs { + // Possible states for managed ingestion from Event Hubs. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // Ingestion is active. + ACTIVE = 1; + + // Permission denied encountered while consuming data from Event Hubs. + // This can happen when `client_id`, or `tenant_id` are invalid. Or the + // right permissions haven't been granted. + EVENT_HUBS_PERMISSION_DENIED = 2; + + // Permission denied encountered while publishing to the topic. + PUBLISH_PERMISSION_DENIED = 3; + + // The provided Event Hubs namespace couldn't be found. + NAMESPACE_NOT_FOUND = 4; + + // The provided Event Hub couldn't be found. + EVENT_HUB_NOT_FOUND = 5; + + // The provided Event Hubs subscription couldn't be found. + SUBSCRIPTION_NOT_FOUND = 6; + + // The provided Event Hubs resource group couldn't be found. + RESOURCE_GROUP_NOT_FOUND = 7; + } + + // Output only. An output-only field that indicates the state of the Event + // Hubs ingestion source. + State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Optional. Name of the resource group within the azure subscription. + string resource_group = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The name of the Event Hubs namespace. + string namespace = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The name of the Event Hub. + string event_hub = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The client id of the Azure application that is being used to + // authenticate Pub/Sub. + string client_id = 5 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The tenant id of the Azure application that is being used to + // authenticate Pub/Sub. + string tenant_id = 6 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The Azure subscription id. + string subscription_id = 7 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The GCP service account to be used for Federated Identity + // authentication. + string gcp_service_account = 8 [(google.api.field_behavior) = OPTIONAL]; + } + + // Ingestion settings for Amazon MSK. + message AwsMsk { + // Possible states for managed ingestion from Amazon MSK. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // Ingestion is active. + ACTIVE = 1; + + // Permission denied encountered while consuming data from Amazon MSK. + MSK_PERMISSION_DENIED = 2; + + // Permission denied encountered while publishing to the topic. + PUBLISH_PERMISSION_DENIED = 3; + + // The provided MSK cluster wasn't found. + CLUSTER_NOT_FOUND = 4; + + // The provided topic wasn't found. + TOPIC_NOT_FOUND = 5; + } + + // Output only. An output-only field that indicates the state of the Amazon + // MSK ingestion source. + State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Required. The Amazon Resource Name (ARN) that uniquely identifies the + // cluster. + string cluster_arn = 2 [(google.api.field_behavior) = REQUIRED]; + + // Required. The name of the topic in the Amazon MSK cluster that Pub/Sub + // will import from. + string topic = 3 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; + + // Required. AWS role ARN to be used for Federated Identity authentication + // with Amazon MSK. Check the Pub/Sub docs for how to set up this role and + // the required permissions that need to be attached to it. + string aws_role_arn = 4 [(google.api.field_behavior) = REQUIRED]; + + // Required. The GCP service account to be used for Federated Identity + // authentication with Amazon MSK (via a `AssumeRoleWithWebIdentity` call + // for the provided role). The `aws_role_arn` must be set up with + // `accounts.google.com:sub` equals to this service account number. + string gcp_service_account = 5 [(google.api.field_behavior) = REQUIRED]; + } + + // Ingestion settings for Confluent Cloud. + message ConfluentCloud { + // Possible states for managed ingestion from Confluent Cloud. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // Ingestion is active. + ACTIVE = 1; + + // Permission denied encountered while consuming data from Confluent + // Cloud. + CONFLUENT_CLOUD_PERMISSION_DENIED = 2; + + // Permission denied encountered while publishing to the topic. + PUBLISH_PERMISSION_DENIED = 3; + + // The provided bootstrap server address is unreachable. + UNREACHABLE_BOOTSTRAP_SERVER = 4; + + // The provided cluster wasn't found. + CLUSTER_NOT_FOUND = 5; + + // The provided topic wasn't found. + TOPIC_NOT_FOUND = 6; + } + + // Output only. An output-only field that indicates the state of the + // Confluent Cloud ingestion source. + State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Required. The address of the bootstrap server. The format is url:port. + string bootstrap_server = 2 [(google.api.field_behavior) = REQUIRED]; + + // Required. The id of the cluster. + string cluster_id = 3 [(google.api.field_behavior) = REQUIRED]; + + // Required. The name of the topic in the Confluent Cloud cluster that + // Pub/Sub will import from. + string topic = 4 [(google.api.field_behavior) = REQUIRED]; + + // Required. The id of the identity pool to be used for Federated Identity + // authentication with Confluent Cloud. See + // https://docs.confluent.io/cloud/current/security/authenticate/workload-identities/identity-providers/oauth/identity-pools.html#add-oauth-identity-pools. + string identity_pool_id = 5 [(google.api.field_behavior) = REQUIRED]; + + // Required. The GCP service account to be used for Federated Identity + // authentication with `identity_pool_id`. + string gcp_service_account = 6 [(google.api.field_behavior) = REQUIRED]; + } + + // Only one source type can have settings set. + oneof source { + // Optional. Amazon Kinesis Data Streams. + AwsKinesis aws_kinesis = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Cloud Storage. + CloudStorage cloud_storage = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Azure Event Hubs. + AzureEventHubs azure_event_hubs = 3 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Amazon MSK. + AwsMsk aws_msk = 5 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Confluent Cloud. + ConfluentCloud confluent_cloud = 6 [(google.api.field_behavior) = OPTIONAL]; + } + + // Optional. Platform Logs settings. If unset, no Platform Logs will be + // generated. + PlatformLogsSettings platform_logs_settings = 4 + [(google.api.field_behavior) = OPTIONAL]; +} + +// Settings for Platform Logs produced by Pub/Sub. +message PlatformLogsSettings { + // Severity levels of Platform Logs. + enum Severity { + // Default value. Logs level is unspecified. Logs will be disabled. + SEVERITY_UNSPECIFIED = 0; + + // Logs will be disabled. + DISABLED = 1; + + // Debug logs and higher-severity logs will be written. + DEBUG = 2; + + // Info logs and higher-severity logs will be written. + INFO = 3; + + // Warning logs and higher-severity logs will be written. + WARNING = 4; + + // Only error logs will be written. + ERROR = 5; + } + + // Optional. The minimum severity level of Platform Logs that will be written. + Severity severity = 1 [(google.api.field_behavior) = OPTIONAL]; +} + +// Payload of the Platform Log entry sent when a failure is encountered while +// ingesting. +message IngestionFailureEvent { + // Specifies the reason why some data may have been left out of + // the desired Pub/Sub message due to the API message limits + // (https://cloud.google.com/pubsub/quotas#resource_limits). For example, + // when the number of attributes is larger than 100, the number of + // attributes is truncated to 100 to respect the limit on the attribute count. + // Other attribute limits are treated similarly. When the size of the desired + // message would've been larger than 10MB, the message won't be published at + // all, and ingestion of the subsequent messages will proceed as normal. + message ApiViolationReason {} + + // Set when an Avro file is unsupported or its format is not valid. When this + // occurs, one or more Avro objects won't be ingested. + message AvroFailureReason {} + + // Set when a Pub/Sub message fails to get published due to a schema + // validation violation. + message SchemaViolationReason {} + + // Set when a Pub/Sub message fails to get published due to a message + // transformation error. + message MessageTransformationFailureReason {} + + // Failure when ingesting from a Cloud Storage source. + message CloudStorageFailure { + // Optional. Name of the Cloud Storage bucket used for ingestion. + string bucket = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Name of the Cloud Storage object which contained the section + // that couldn't be ingested. + string object_name = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Generation of the Cloud Storage object which contained the + // section that couldn't be ingested. + int64 object_generation = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Reason why ingestion failed for the specified object. + oneof reason { + // Optional. Failure encountered when parsing an Avro file. + AvroFailureReason avro_failure_reason = 5 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The Pub/Sub API limits prevented the desired message from + // being published. + ApiViolationReason api_violation_reason = 6 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The Pub/Sub message failed schema validation. + SchemaViolationReason schema_violation_reason = 7 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure encountered when applying a message transformation to + // the Pub/Sub message. + MessageTransformationFailureReason message_transformation_failure_reason = + 8 [(google.api.field_behavior) = OPTIONAL]; + } + } + + // Failure when ingesting from an Amazon MSK source. + message AwsMskFailureReason { + // Optional. The ARN of the cluster of the topic being ingested from. + string cluster_arn = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The name of the Kafka topic being ingested from. + string kafka_topic = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The partition ID of the message that failed to be ingested. + int64 partition_id = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The offset within the partition of the message that failed to + // be ingested. + int64 offset = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Reason why ingestion failed for the specified message. + oneof reason { + // Optional. The Pub/Sub API limits prevented the desired message from + // being published. + ApiViolationReason api_violation_reason = 5 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The Pub/Sub message failed schema validation. + SchemaViolationReason schema_violation_reason = 6 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure encountered when applying a message transformation to + // the Pub/Sub message. + MessageTransformationFailureReason message_transformation_failure_reason = + 7 [(google.api.field_behavior) = OPTIONAL]; + } + } + + // Failure when ingesting from an Azure Event Hubs source. + message AzureEventHubsFailureReason { + // Optional. The namespace containing the event hub being ingested from. + string namespace = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The name of the event hub being ingested from. + string event_hub = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The partition ID of the message that failed to be ingested. + int64 partition_id = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The offset within the partition of the message that failed to + // be ingested. + int64 offset = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Reason why ingestion failed for the specified message. + oneof reason { + // Optional. The Pub/Sub API limits prevented the desired message from + // being published. + ApiViolationReason api_violation_reason = 5 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The Pub/Sub message failed schema validation. + SchemaViolationReason schema_violation_reason = 6 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure encountered when applying a message transformation to + // the Pub/Sub message. + MessageTransformationFailureReason message_transformation_failure_reason = + 7 [(google.api.field_behavior) = OPTIONAL]; + } + } + + // Failure when ingesting from a Confluent Cloud source. + message ConfluentCloudFailureReason { + // Optional. The cluster ID containing the topic being ingested from. + string cluster_id = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The name of the Kafka topic being ingested from. + string kafka_topic = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The partition ID of the message that failed to be ingested. + int64 partition_id = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The offset within the partition of the message that failed to + // be ingested. + int64 offset = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Reason why ingestion failed for the specified message. + oneof reason { + // Optional. The Pub/Sub API limits prevented the desired message from + // being published. + ApiViolationReason api_violation_reason = 5 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The Pub/Sub message failed schema validation. + SchemaViolationReason schema_violation_reason = 6 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure encountered when applying a message transformation to + // the Pub/Sub message. + MessageTransformationFailureReason message_transformation_failure_reason = + 7 [(google.api.field_behavior) = OPTIONAL]; + } + } + + // Failure when ingesting from an AWS Kinesis source. + message AwsKinesisFailureReason { + // Optional. The stream ARN of the Kinesis stream being ingested from. + string stream_arn = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The partition key of the message that failed to be ingested. + string partition_key = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The sequence number of the message that failed to be ingested. + string sequence_number = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Reason why ingestion failed for the specified message. + oneof reason { + // Optional. The Pub/Sub message failed schema validation. + SchemaViolationReason schema_violation_reason = 4 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure encountered when applying a message transformation to + // the Pub/Sub message. + MessageTransformationFailureReason message_transformation_failure_reason = + 5 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The message failed to be published due to an API violation. + // This is only set when the size of the data field of the Kinesis record + // is zero. + ApiViolationReason api_violation_reason = 6 + [(google.api.field_behavior) = OPTIONAL]; + } + } + + // Required. Name of the import topic. Format is: + // projects/{project_name}/topics/{topic_name}. + string topic = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; + + // Required. Error details explaining why ingestion to Pub/Sub has failed. + string error_message = 2 [(google.api.field_behavior) = REQUIRED]; + + oneof failure { + // Optional. Failure when ingesting from Cloud Storage. + CloudStorageFailure cloud_storage_failure = 3 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure when ingesting from Amazon MSK. + AwsMskFailureReason aws_msk_failure = 4 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure when ingesting from Azure Event Hubs. + AzureEventHubsFailureReason azure_event_hubs_failure = 5 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure when ingesting from Confluent Cloud. + ConfluentCloudFailureReason confluent_cloud_failure = 6 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Failure when ingesting from AWS Kinesis. + AwsKinesisFailureReason aws_kinesis_failure = 7 + [(google.api.field_behavior) = OPTIONAL]; + } +} + +// User-defined JavaScript function that can transform or filter a Pub/Sub +// message. +message JavaScriptUDF { + // Required. Name of the JavasScript function that should applied to Pub/Sub + // messages. + string function_name = 1 [(google.api.field_behavior) = REQUIRED]; + + // Required. JavaScript code that contains a function `function_name` with the + // below signature: + // + // ``` + // /** + // * Transforms a Pub/Sub message. + // + // * @return {(Object)>|null)} - To + // * filter a message, return `null`. To transform a message return a map + // * with the following keys: + // * - (required) 'data' : {string} + // * - (optional) 'attributes' : {Object} + // * Returning empty `attributes` will remove all attributes from the + // * message. + // * + // * @param {(Object)>} Pub/Sub + // * message. Keys: + // * - (required) 'data' : {string} + // * - (required) 'attributes' : {Object} + // * + // * @param {Object} metadata - Pub/Sub message metadata. + // * Keys: + // * - (optional) 'message_id' : {string} + // * - (optional) 'publish_time': {string} YYYY-MM-DDTHH:MM:SSZ format + // * - (optional) 'ordering_key': {string} + // */ + // + // function (message, metadata) { + // } + // ``` + string code = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// Configuration for making inference requests against Vertex AI models. +message AIInference { + // Configuration for making inferences using arbitrary JSON payloads. + message UnstructuredInference { + // Optional. A parameters object to be included in each inference request. + // The parameters object is combined with the data field of the Pub/Sub + // message to form the inference request. + google.protobuf.Struct parameters = 1 + [(google.api.field_behavior) = OPTIONAL]; + } + + // Required. An endpoint to a Vertex AI model of the form + // `projects/{project}/locations/{location}/endpoints/{endpoint}` or + // `projects/{project}/locations/{location}/publishers/{publisher}/models/{model}`. + // Vertex AI API requests will be sent to this endpoint. + string endpoint = 1 [(google.api.field_behavior) = REQUIRED]; + + // The format of inference requests made to the endpoint. + oneof inference_mode { + // Optional. Requests and responses can be any arbitrary JSON object. + UnstructuredInference unstructured_inference = 2 + [(google.api.field_behavior) = OPTIONAL]; + } + + // Optional. The service account to use to make prediction requests against + // endpoints. The resource creator or updater that specifies this field must + // have `iam.serviceAccounts.actAs` permission on the service account. If not + // specified, the Pub/Sub [service + // agent](https://cloud.google.com/iam/docs/service-agents), + // service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used. + string service_account_email = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// All supported message transforms types. +message MessageTransform { + // The type of transform to apply to messages. + oneof transform { + // Optional. JavaScript User Defined Function. If multiple JavaScriptUDF's + // are specified on a resource, each must have a unique `function_name`. + JavaScriptUDF javascript_udf = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. AI Inference. Specifies the Vertex AI endpoint that inference + // requests built from the Pub/Sub message data and provided parameters will + // be sent to. + AIInference ai_inference = 6 [(google.api.field_behavior) = OPTIONAL]; + } + + // Optional. This field is deprecated, use the `disabled` field to disable + // transforms. + bool enabled = 3 [deprecated = true, (google.api.field_behavior) = OPTIONAL]; + + // Optional. If true, the transform is disabled and will not be applied to + // messages. Defaults to `false`. + bool disabled = 4 [(google.api.field_behavior) = OPTIONAL]; +} + +// A topic resource. +message Topic { + option (google.api.resource) = { + type: "pubsub.googleapis.com/Topic" + pattern: "projects/{project}/topics/{topic}" + pattern: "_deleted-topic_" + plural: "topics" + singular: "topic" + }; + + // The state of the topic. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // The topic does not have any persistent errors. + ACTIVE = 1; + + // Ingestion from the data source has encountered a permanent error. + // See the more detailed error state in the corresponding ingestion + // source configuration. + INGESTION_RESOURCE_ERROR = 2; + } + + // Required. Identifier. The name of the topic. It must have the format + // `"projects/{project}/topics/{topic}"`. `{topic}` must start with a letter, + // and contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`), + // underscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent + // signs (`%`). It must be between 3 and 255 characters in length, and it + // must not start with `"goog"`. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IDENTIFIER + ]; + + // Optional. See [Creating and managing labels] + // (https://cloud.google.com/pubsub/docs/labels). + map labels = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Policy constraining the set of Google Cloud Platform regions + // where messages published to the topic may be stored. If not present, then + // no constraints are in effect. + MessageStoragePolicy message_storage_policy = 3 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The resource name of the Cloud KMS CryptoKey to be used to + // protect access to messages published on this topic. + // + // The expected format is `projects/*/locations/*/keyRings/*/cryptoKeys/*`. + string kms_key_name = 5 [ + (google.api.field_behavior) = OPTIONAL, + (google.api.resource_reference) = { + type: "cloudkms.googleapis.com/CryptoKey" + } + ]; + + // Optional. Settings for validating messages published against a schema. + SchemaSettings schema_settings = 6 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Reserved for future use. This field is set only in responses from + // the server; it is ignored if it is set in any requests. + bool satisfies_pzs = 7 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Indicates the minimum duration to retain a message after it is + // published to the topic. If this field is set, messages published to the + // topic in the last `message_retention_duration` are always available to + // subscribers. For instance, it allows any attached subscription to [seek to + // a + // timestamp](https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time) + // that is up to `message_retention_duration` in the past. If this field is + // not set, message retention is controlled by settings on individual + // subscriptions. Cannot be more than 31 days or less than 10 minutes. + google.protobuf.Duration message_retention_duration = 8 + [(google.api.field_behavior) = OPTIONAL]; + + // Output only. An output-only field indicating the state of the topic. + State state = 9 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Optional. Settings for ingestion from a data source into this topic. + IngestionDataSourceSettings ingestion_data_source_settings = 10 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Transforms to be applied to messages published to the topic. + // Transforms are applied in the order specified. + repeated MessageTransform message_transforms = 13 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Input only. Immutable. Tag keys/values directly bound to this + // resource. For example: + // "123/environment": "production", + // "123/costCenter": "marketing" + // See https://docs.cloud.google.com/pubsub/docs/tags for more information on + // using tags with Pub/Sub resources. + map tags = 14 [ + (google.api.field_behavior) = INPUT_ONLY, + (google.api.field_behavior) = IMMUTABLE, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// A message that is published by publishers and consumed by subscribers. The +// message must contain either a non-empty data field or at least one attribute. +// Note that client libraries represent this object differently +// depending on the language. See the corresponding [client library +// documentation](https://cloud.google.com/pubsub/docs/reference/libraries) for +// more information. See [quotas and limits] +// (https://cloud.google.com/pubsub/quotas) for more information about message +// limits. +message PubsubMessage { + // Optional. The message data field. If this field is empty, the message must + // contain at least one attribute. + bytes data = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Attributes for this message. If this field is empty, the message + // must contain non-empty data. This can be used to filter messages on the + // subscription. + map attributes = 2 [(google.api.field_behavior) = OPTIONAL]; + + // ID of this message, assigned by the server when the message is published. + // Guaranteed to be unique within the topic. This value may be read by a + // subscriber that receives a `PubsubMessage` via a `Pull` call or a push + // delivery. It must not be populated by the publisher in a `Publish` call. + string message_id = 3; + + // The time at which the message was published, populated by the server when + // it receives the `Publish` call. It must not be populated by the + // publisher in a `Publish` call. + google.protobuf.Timestamp publish_time = 4; + + // Optional. If non-empty, identifies related messages for which publish order + // should be respected. If a `Subscription` has `enable_message_ordering` set + // to `true`, messages published with the same non-empty `ordering_key` value + // will be delivered to subscribers in the order in which they are received by + // the Pub/Sub system. All `PubsubMessage`s published in a given + // `PublishRequest` must specify the same `ordering_key` value. For more + // information, see [ordering + // messages](https://cloud.google.com/pubsub/docs/ordering). + string ordering_key = 5 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the GetTopic method. +message GetTopicRequest { + // Required. The name of the topic to get. + // Format is `projects/{project}/topics/{topic}`. + string topic = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; +} + +// Request for the UpdateTopic method. +message UpdateTopicRequest { + // Required. The updated topic object. + Topic topic = 1 [(google.api.field_behavior) = REQUIRED]; + + // Required. Indicates which fields in the provided topic to update. Must be + // specified and non-empty. Note that if `update_mask` contains + // "message_storage_policy" but the `message_storage_policy` is not set in + // the `topic` provided above, then the updated value is determined by the + // policy configured at the project or organization level. + google.protobuf.FieldMask update_mask = 2 + [(google.api.field_behavior) = REQUIRED]; +} + +// Request for the Publish method. +message PublishRequest { + // Required. The messages in the request will be published on this topic. + // Format is `projects/{project}/topics/{topic}`. + string topic = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; + + // Required. The messages to publish. + repeated PubsubMessage messages = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// Response for the `Publish` method. +message PublishResponse { + // Optional. The server-assigned ID of each published message, in the same + // order as the messages in the request. IDs are guaranteed to be unique + // within the topic. + repeated string message_ids = 1 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the `ListTopics` method. +message ListTopicsRequest { + // Required. The name of the project in which to list topics. + // Format is `projects/{project-id}`. + string project = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "cloudresourcemanager.googleapis.com/Project" + } + ]; + + // Optional. Maximum number of topics to return. + int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The value returned by the last `ListTopicsResponse`; indicates + // that this is a continuation of a prior `ListTopics` call, and that the + // system should return the next page of data. + string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for the `ListTopics` method. +message ListTopicsResponse { + // Optional. The resulting topics. + repeated Topic topics = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If not empty, indicates that there may be more topics that match + // the request; this value should be passed in a new `ListTopicsRequest`. + string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the `ListTopicSubscriptions` method. +message ListTopicSubscriptionsRequest { + // Required. The name of the topic that subscriptions are attached to. + // Format is `projects/{project}/topics/{topic}`. + string topic = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; + + // Optional. Maximum number of subscription names to return. + int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The value returned by the last `ListTopicSubscriptionsResponse`; + // indicates that this is a continuation of a prior `ListTopicSubscriptions` + // call, and that the system should return the next page of data. + string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for the `ListTopicSubscriptions` method. +message ListTopicSubscriptionsResponse { + // Optional. The names of subscriptions attached to the topic specified in the + // request. + repeated string subscriptions = 1 [ + (google.api.field_behavior) = OPTIONAL, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; + + // Optional. If not empty, indicates that there may be more subscriptions that + // match the request; this value should be passed in a new + // `ListTopicSubscriptionsRequest` to get more subscriptions. + string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the `ListTopicSnapshots` method. +message ListTopicSnapshotsRequest { + // Required. The name of the topic that snapshots are attached to. + // Format is `projects/{project}/topics/{topic}`. + string topic = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; + + // Optional. Maximum number of snapshot names to return. + int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The value returned by the last `ListTopicSnapshotsResponse`; + // indicates that this is a continuation of a prior `ListTopicSnapshots` call, + // and that the system should return the next page of data. + string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for the `ListTopicSnapshots` method. +message ListTopicSnapshotsResponse { + // Optional. The names of the snapshots that match the request. + repeated string snapshots = 1 [ + (google.api.field_behavior) = OPTIONAL, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Snapshot" } + ]; + + // Optional. If not empty, indicates that there may be more snapshots that + // match the request; this value should be passed in a new + // `ListTopicSnapshotsRequest` to get more snapshots. + string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the `DeleteTopic` method. +message DeleteTopicRequest { + // Required. Name of the topic to delete. + // Format is `projects/{project}/topics/{topic}`. + string topic = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; +} + +// Request for the DetachSubscription method. +message DetachSubscriptionRequest { + // Required. The subscription to detach. + // Format is `projects/{project}/subscriptions/{subscription}`. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; +} + +// Response for the DetachSubscription method. +// Reserved for future use. +message DetachSubscriptionResponse {} + +// The service that an application uses to manipulate subscriptions and to +// consume messages from a subscription via the `Pull` method or by +// establishing a bi-directional stream using the `StreamingPull` method. +service Subscriber { + option (google.api.default_host) = "pubsub.googleapis.com"; + option (google.api.oauth_scopes) = + "https://www.googleapis.com/auth/cloud-platform," + "https://www.googleapis.com/auth/pubsub"; + + // Creates a subscription to a given topic. See the [resource name rules] + // (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). + // If the subscription already exists, returns `ALREADY_EXISTS`. + // If the corresponding topic doesn't exist, returns `NOT_FOUND`. + // + // If the name is not provided in the request, the server will assign a random + // name for this subscription on the same project as the topic, conforming + // to the [resource name format] + // (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). The + // generated name is populated in the returned Subscription object. Note that + // for REST API requests, you must specify a name in the request. + rpc CreateSubscription(Subscription) returns (Subscription) { + option (google.api.http) = { + put: "/v1/{name=projects/*/subscriptions/*}" + body: "*" + }; + option (google.api.method_signature) = + "name,topic,push_config,ack_deadline_seconds"; + } + + // Gets the configuration details of a subscription. + rpc GetSubscription(GetSubscriptionRequest) returns (Subscription) { + option (google.api.http) = { + get: "/v1/{subscription=projects/*/subscriptions/*}" + }; + option (google.api.method_signature) = "subscription"; + } + + // Updates an existing subscription by updating the fields specified in the + // update mask. Note that certain properties of a subscription, such as its + // topic, are not modifiable. + rpc UpdateSubscription(UpdateSubscriptionRequest) returns (Subscription) { + option (google.api.http) = { + patch: "/v1/{subscription.name=projects/*/subscriptions/*}" + body: "*" + }; + option (google.api.method_signature) = "subscription,update_mask"; + } + + // Lists matching subscriptions. + rpc ListSubscriptions(ListSubscriptionsRequest) + returns (ListSubscriptionsResponse) { + option (google.api.http) = { + get: "/v1/{project=projects/*}/subscriptions" + }; + option (google.api.method_signature) = "project"; + } + + // Deletes an existing subscription. All messages retained in the subscription + // are immediately dropped. Calls to `Pull` after deletion will return + // `NOT_FOUND`. After a subscription is deleted, a new one may be created with + // the same name, but the new one has no association with the old + // subscription or its topic unless the same topic is specified. + rpc DeleteSubscription(DeleteSubscriptionRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/v1/{subscription=projects/*/subscriptions/*}" + }; + option (google.api.method_signature) = "subscription"; + } + + // Modifies the ack deadline for a specific message. This method is useful + // to indicate that more time is needed to process a message by the + // subscriber, or to make the message available for redelivery if the + // processing was interrupted. Note that this does not modify the + // subscription-level `ackDeadlineSeconds` used for subsequent messages. + rpc ModifyAckDeadline(ModifyAckDeadlineRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post: "/v1/{subscription=projects/*/subscriptions/*}:modifyAckDeadline" + body: "*" + }; + option (google.api.method_signature) = + "subscription,ack_ids,ack_deadline_seconds"; + } + + // Acknowledges the messages associated with the `ack_ids` in the + // `AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages + // from the subscription. + // + // Acknowledging a message whose ack deadline has expired may succeed, + // but such a message may be redelivered later. Acknowledging a message more + // than once will not result in an error. + rpc Acknowledge(AcknowledgeRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + post: "/v1/{subscription=projects/*/subscriptions/*}:acknowledge" + body: "*" + }; + option (google.api.method_signature) = "subscription,ack_ids"; + } + + // Pulls messages from the server. + rpc Pull(PullRequest) returns (PullResponse) { + option (google.api.http) = { + post: "/v1/{subscription=projects/*/subscriptions/*}:pull" + body: "*" + }; + option (google.api.method_signature) = + "subscription,return_immediately,max_messages"; + option (google.api.method_signature) = "subscription,max_messages"; + } + + // Establishes a stream with the server, which sends messages down to the + // client. The client streams acknowledgments and ack deadline modifications + // back to the server. The server will close the stream and return the status + // on any error. The server may close the stream with status `UNAVAILABLE` to + // reassign server-side resources, in which case, the client should + // re-establish the stream. Flow control can be achieved by configuring the + // underlying RPC channel. + rpc StreamingPull(stream StreamingPullRequest) + returns (stream StreamingPullResponse) {} + + // Modifies the `PushConfig` for a specified subscription. + // + // This may be used to change a push subscription to a pull one (signified by + // an empty `PushConfig`) or vice versa, or change the endpoint URL and other + // attributes of a push subscription. Messages will accumulate for delivery + // continuously through the call regardless of changes to the `PushConfig`. + rpc ModifyPushConfig(ModifyPushConfigRequest) + returns (google.protobuf.Empty) { + option (google.api.http) = { + post: "/v1/{subscription=projects/*/subscriptions/*}:modifyPushConfig" + body: "*" + }; + option (google.api.method_signature) = "subscription,push_config"; + } + + // Gets the configuration details of a snapshot. Snapshots are used in + // [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, + // which allow you to manage message acknowledgments in bulk. That is, you can + // set the acknowledgment state of messages in an existing subscription to the + // state captured by a snapshot. + rpc GetSnapshot(GetSnapshotRequest) returns (Snapshot) { + option (google.api.http) = { + get: "/v1/{snapshot=projects/*/snapshots/*}" + }; + option (google.api.method_signature) = "snapshot"; + } + + // Lists the existing snapshots. Snapshots are used in [Seek]( + // https://cloud.google.com/pubsub/docs/replay-overview) operations, which + // allow you to manage message acknowledgments in bulk. That is, you can set + // the acknowledgment state of messages in an existing subscription to the + // state captured by a snapshot. + rpc ListSnapshots(ListSnapshotsRequest) returns (ListSnapshotsResponse) { + option (google.api.http) = { + get: "/v1/{project=projects/*}/snapshots" + }; + option (google.api.method_signature) = "project"; + } + + // Creates a snapshot from the requested subscription. Snapshots are used in + // [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, + // which allow you to manage message acknowledgments in bulk. That is, you can + // set the acknowledgment state of messages in an existing subscription to the + // state captured by a snapshot. + // If the snapshot already exists, returns `ALREADY_EXISTS`. + // If the requested subscription doesn't exist, returns `NOT_FOUND`. + // If the backlog in the subscription is too old -- and the resulting snapshot + // would expire in less than 1 hour -- then `FAILED_PRECONDITION` is returned. + // See also the `Snapshot.expire_time` field. If the name is not provided in + // the request, the server will assign a random + // name for this snapshot on the same project as the subscription, conforming + // to the [resource name format] + // (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). The + // generated name is populated in the returned Snapshot object. Note that for + // REST API requests, you must specify a name in the request. + rpc CreateSnapshot(CreateSnapshotRequest) returns (Snapshot) { + option (google.api.http) = { + put: "/v1/{name=projects/*/snapshots/*}" + body: "*" + }; + option (google.api.method_signature) = "name,subscription"; + } + + // Updates an existing snapshot by updating the fields specified in the update + // mask. Snapshots are used in + // [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations, + // which allow you to manage message acknowledgments in bulk. That is, you can + // set the acknowledgment state of messages in an existing subscription to the + // state captured by a snapshot. + rpc UpdateSnapshot(UpdateSnapshotRequest) returns (Snapshot) { + option (google.api.http) = { + patch: "/v1/{snapshot.name=projects/*/snapshots/*}" + body: "*" + }; + option (google.api.method_signature) = "snapshot,update_mask"; + } + + // Removes an existing snapshot. Snapshots are used in [Seek] + // (https://cloud.google.com/pubsub/docs/replay-overview) operations, which + // allow you to manage message acknowledgments in bulk. That is, you can set + // the acknowledgment state of messages in an existing subscription to the + // state captured by a snapshot. + // When the snapshot is deleted, all messages retained in the snapshot + // are immediately dropped. After a snapshot is deleted, a new one may be + // created with the same name, but the new one has no association with the old + // snapshot or its subscription, unless the same subscription is specified. + rpc DeleteSnapshot(DeleteSnapshotRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/v1/{snapshot=projects/*/snapshots/*}" + }; + option (google.api.method_signature) = "snapshot"; + } + + // Seeks an existing subscription to a point in time or to a given snapshot, + // whichever is provided in the request. Snapshots are used in [Seek] + // (https://cloud.google.com/pubsub/docs/replay-overview) operations, which + // allow you to manage message acknowledgments in bulk. That is, you can set + // the acknowledgment state of messages in an existing subscription to the + // state captured by a snapshot. Note that both the subscription and the + // snapshot must be on the same topic. + rpc Seek(SeekRequest) returns (SeekResponse) { + option (google.api.http) = { + post: "/v1/{subscription=projects/*/subscriptions/*}:seek" + body: "*" + }; + } +} + +// A subscription resource. If none of `push_config`, `bigquery_config`, or +// `cloud_storage_config` is set, then the subscriber will pull and ack messages +// using API methods. At most one of these fields may be set. +message Subscription { + option (google.api.resource) = { + type: "pubsub.googleapis.com/Subscription" + pattern: "projects/{project}/subscriptions/{subscription}" + plural: "subscriptions" + singular: "subscription" + }; + + // Possible states for a subscription. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // The subscription can actively receive messages + ACTIVE = 1; + + // The subscription cannot receive messages because of an error with the + // resource to which it pushes messages. See the more detailed error state + // in the corresponding configuration. + RESOURCE_ERROR = 2; + } + + // Information about an associated [Analytics Hub + // subscription](https://cloud.google.com/bigquery/docs/analytics-hub-manage-subscriptions). + message AnalyticsHubSubscriptionInfo { + // Optional. The name of the associated Analytics Hub listing resource. + // Pattern: + // "projects/{project}/locations/{location}/dataExchanges/{data_exchange}/listings/{listing}" + string listing = 1 [ + (google.api.field_behavior) = OPTIONAL, + (google.api.resource_reference) = { + type: "analyticshub.googleapis.com/Listing" + } + ]; + + // Optional. The name of the associated Analytics Hub subscription resource. + // Pattern: + // "projects/{project}/locations/{location}/subscriptions/{subscription}" + string subscription = 2 [(google.api.field_behavior) = OPTIONAL]; + } + + // Required. Identifier. The name of the subscription. It must have the format + // `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must + // start with a letter, and contain only letters (`[A-Za-z]`), numbers + // (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`), + // plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters + // in length, and it must not start with `"goog"`. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.field_behavior) = IDENTIFIER + ]; + + // Required. The name of the topic from which this subscription is receiving + // messages. Format is `projects/{project}/topics/{topic}`. The value of this + // field will be `_deleted-topic_` if the topic has been deleted. + string topic = 2 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; + + // Optional. If push delivery is used with this subscription, this field is + // used to configure it. + PushConfig push_config = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If delivery to BigQuery is used with this subscription, this + // field is used to configure it. + BigQueryConfig bigquery_config = 18 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If delivery to Google Cloud Storage is used with this + // subscription, this field is used to configure it. + CloudStorageConfig cloud_storage_config = 22 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If delivery to Bigtable is used with this subscription, this + // field is used to configure it. + BigtableConfig bigtable_config = 27 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The approximate amount of time (on a best-effort basis) Pub/Sub + // waits for the subscriber to acknowledge receipt before resending the + // message. In the interval after the message is delivered and before it is + // acknowledged, it is considered to be _outstanding_. During that time + // period, the message will not be redelivered (on a best-effort basis). + // + // For pull subscriptions, this value is used as the initial value for the ack + // deadline. To override this value for a given message, call + // `ModifyAckDeadline` with the corresponding `ack_id` if using + // non-streaming pull or send the `ack_id` in a + // `StreamingModifyAckDeadlineRequest` if using streaming pull. + // The minimum custom deadline you can specify is 10 seconds. + // The maximum custom deadline you can specify is 600 seconds (10 minutes). + // If this parameter is 0, a default value of 10 seconds is used. + // + // For push delivery, this value is also used to set the request timeout for + // the call to the push endpoint. + // + // If the subscriber never acknowledges the message, the Pub/Sub + // system will eventually redeliver the message. + int32 ack_deadline_seconds = 5 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Indicates whether to retain acknowledged messages. If true, then + // messages are not expunged from the subscription's backlog, even if they are + // acknowledged, until they fall out of the `message_retention_duration` + // window. This must be true if you would like to [`Seek` to a timestamp] + // (https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time) in + // the past to replay previously-acknowledged messages. + bool retain_acked_messages = 7 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. How long to retain unacknowledged messages in the subscription's + // backlog, from the moment a message is published. If `retain_acked_messages` + // is true, then this also configures the retention of acknowledged messages, + // and thus configures how far back in time a `Seek` can be done. Defaults to + // 7 days. Cannot be more than 31 days or less than 10 minutes. + google.protobuf.Duration message_retention_duration = 8 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. See [Creating and managing + // labels](https://cloud.google.com/pubsub/docs/labels). + map labels = 9 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If true, messages published with the same `ordering_key` in + // `PubsubMessage` will be delivered to the subscribers in the order in which + // they are received by the Pub/Sub system. Otherwise, they may be delivered + // in any order. + bool enable_message_ordering = 10 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. A policy that specifies the conditions for this subscription's + // expiration. A subscription is considered active as long as any connected + // subscriber is successfully consuming messages from the subscription or is + // issuing operations on the subscription. If `expiration_policy` is not set, + // a *default policy* with `ttl` of 31 days will be used. The minimum allowed + // value for `expiration_policy.ttl` is 1 day. If `expiration_policy` is set, + // but `expiration_policy.ttl` is not set, the subscription never expires. + ExpirationPolicy expiration_policy = 11 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. An expression written in the Pub/Sub [filter + // language](https://cloud.google.com/pubsub/docs/filtering). If non-empty, + // then only `PubsubMessage`s whose `attributes` field matches the filter are + // delivered on this subscription. If empty, then no messages are filtered + // out. + string filter = 12 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. A policy that specifies the conditions for dead lettering + // messages in this subscription. If dead_letter_policy is not set, dead + // lettering is disabled. + // + // The Pub/Sub service account associated with this subscriptions's + // parent project (i.e., + // service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have + // permission to Acknowledge() messages on this subscription. + DeadLetterPolicy dead_letter_policy = 13 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. A policy that specifies how Pub/Sub retries message delivery for + // this subscription. + // + // If not set, the default retry policy is applied. This generally implies + // that messages will be retried as soon as possible for healthy subscribers. + // RetryPolicy will be triggered on NACKs or acknowledgment deadline exceeded + // events for a given message. + RetryPolicy retry_policy = 14 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Indicates whether the subscription is detached from its topic. + // Detached subscriptions don't receive messages from their topic and don't + // retain any backlog. `Pull` and `StreamingPull` requests will return + // FAILED_PRECONDITION. If the subscription is a push subscription, pushes to + // the endpoint will not be made. + bool detached = 15 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If true, Pub/Sub provides the following guarantees for the + // delivery of a message with a given value of `message_id` on this + // subscription: + // + // * The message sent to a subscriber is guaranteed not to be resent + // before the message's acknowledgment deadline expires. + // * An acknowledged message will not be resent to a subscriber. + // + // Note that subscribers may still receive multiple copies of a message + // when `enable_exactly_once_delivery` is true if the message was published + // multiple times by a publisher client. These copies are considered distinct + // by Pub/Sub and have distinct `message_id` values. + bool enable_exactly_once_delivery = 16 + [(google.api.field_behavior) = OPTIONAL]; + + // Output only. Indicates the minimum duration for which a message is retained + // after it is published to the subscription's topic. If this field is set, + // messages published to the subscription's topic in the last + // `topic_message_retention_duration` are always available to subscribers. See + // the `message_retention_duration` field in `Topic`. This field is set only + // in responses from the server; it is ignored if it is set in any requests. + google.protobuf.Duration topic_message_retention_duration = 17 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. An output-only field indicating whether or not the + // subscription can receive messages. + State state = 19 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. Information about the associated Analytics Hub subscription. + // Only set if the subscription is created by Analytics Hub. + AnalyticsHubSubscriptionInfo analytics_hub_subscription_info = 23 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Optional. Transforms to be applied to messages before they are delivered to + // subscribers. Transforms are applied in the order specified. + repeated MessageTransform message_transforms = 25 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Input only. Immutable. Tag keys/values directly bound to this + // resource. For example: + // "123/environment": "production", + // "123/costCenter": "marketing" + // See https://docs.cloud.google.com/pubsub/docs/tags for more information on + // using tags with Pub/Sub resources. + map tags = 26 [ + (google.api.field_behavior) = INPUT_ONLY, + (google.api.field_behavior) = IMMUTABLE, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// A policy that specifies how Pub/Sub retries message delivery. +// +// Retry delay will be exponential based on provided minimum and maximum +// backoffs. https://en.wikipedia.org/wiki/Exponential_backoff. +// +// RetryPolicy will be triggered on NACKs or acknowledgment deadline exceeded +// events for a given message. +// +// Retry Policy is implemented on a best effort basis. At times, the delay +// between consecutive deliveries may not match the configuration. That is, +// delay can be more or less than configured backoff. +message RetryPolicy { + // Optional. The minimum delay between consecutive deliveries of a given + // message. Value should be between 0 and 600 seconds. Defaults to 10 seconds. + google.protobuf.Duration minimum_backoff = 1 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The maximum delay between consecutive deliveries of a given + // message. Value should be between 0 and 600 seconds. Defaults to 600 + // seconds. + google.protobuf.Duration maximum_backoff = 2 + [(google.api.field_behavior) = OPTIONAL]; +} + +// Dead lettering is done on a best effort basis. The same message might be +// dead lettered multiple times. +// +// If validation on any of the fields fails at subscription creation/updation, +// the create/update subscription request will fail. +message DeadLetterPolicy { + // Optional. The name of the topic to which dead letter messages should be + // published. Format is `projects/{project}/topics/{topic}`.The Pub/Sub + // service account associated with the enclosing subscription's parent project + // (i.e., service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must + // have permission to Publish() to this topic. + // + // The operation will fail if the topic does not exist. + // Users should ensure that there is a subscription attached to this topic + // since messages published to a topic with no subscriptions are lost. + string dead_letter_topic = 1 [ + (google.api.field_behavior) = OPTIONAL, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; + + // Optional. The maximum number of delivery attempts for any message. The + // value must be between 5 and 100. + // + // The number of delivery attempts is defined as 1 + (the sum of number of + // NACKs and number of times the acknowledgment deadline has been exceeded + // for the message). + // + // A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that + // client libraries may automatically extend ack_deadlines. + // + // This field will be honored on a best effort basis. + // + // If this parameter is 0, a default value of 5 is used. + int32 max_delivery_attempts = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// A policy that specifies the conditions for resource expiration (i.e., +// automatic resource deletion). +message ExpirationPolicy { + // Optional. Specifies the "time-to-live" duration for an associated resource. + // The resource expires if it is not active for a period of `ttl`. The + // definition of "activity" depends on the type of the associated resource. + // The minimum and maximum allowed values for `ttl` depend on the type of the + // associated resource, as well. If `ttl` is not set, the associated resource + // never expires. + google.protobuf.Duration ttl = 1 [(google.api.field_behavior) = OPTIONAL]; +} + +// Configuration for a push delivery endpoint. +message PushConfig { + // Contains information needed for generating an + // [OpenID Connect + // token](https://developers.google.com/identity/protocols/OpenIDConnect). + message OidcToken { + // Optional. [Service account + // email](https://cloud.google.com/iam/docs/service-accounts) + // used for generating the OIDC token. For more information + // on setting up authentication, see + // [Push subscriptions](https://cloud.google.com/pubsub/docs/push). + string service_account_email = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Audience to be used when generating OIDC token. The audience + // claim identifies the recipients that the JWT is intended for. The + // audience value is a single case-sensitive string. Having multiple values + // (array) for the audience field is not supported. More info about the OIDC + // JWT token audience here: + // https://tools.ietf.org/html/rfc7519#section-4.1.3 Note: if not specified, + // the Push endpoint URL will be used. + string audience = 2 [(google.api.field_behavior) = OPTIONAL]; + } + + // The payload to the push endpoint is in the form of the JSON representation + // of a PubsubMessage + // (https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#pubsubmessage). + message PubsubWrapper {} + + // Sets the `data` field as the HTTP body for delivery. + message NoWrapper { + // Optional. When true, writes the Pub/Sub message metadata to + // `x-goog-pubsub-:` headers of the HTTP request. Writes the + // Pub/Sub message attributes to `:` headers of the HTTP request. + bool write_metadata = 1 [(google.api.field_behavior) = OPTIONAL]; + } + + // Optional. A URL locating the endpoint to which messages should be pushed. + // For example, a Webhook endpoint might use `https://example.com/push`. + string push_endpoint = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Endpoint configuration attributes that can be used to control + // different aspects of the message delivery. + // + // The only currently supported attribute is `x-goog-version`, which you can + // use to change the format of the pushed message. This attribute + // indicates the version of the data expected by the endpoint. This + // controls the shape of the pushed message (i.e., its fields and metadata). + // + // If not present during the `CreateSubscription` call, it will default to + // the version of the Pub/Sub API used to make such call. If not present in a + // `ModifyPushConfig` call, its value will not be changed. `GetSubscription` + // calls will always return a valid version, even if the subscription was + // created without this attribute. + // + // The only supported values for the `x-goog-version` attribute are: + // + // * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API. + // * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API. + // + // For example: + // `attributes { "x-goog-version": "v1" }` + map attributes = 2 [(google.api.field_behavior) = OPTIONAL]; + + // An authentication method used by push endpoints to verify the source of + // push requests. This can be used with push endpoints that are private by + // default to allow requests only from the Pub/Sub system, for example. + // This field is optional and should be set only by users interested in + // authenticated push. + oneof authentication_method { + // Optional. If specified, Pub/Sub will generate and attach an OIDC JWT + // token as an `Authorization` header in the HTTP request for every pushed + // message. + OidcToken oidc_token = 3 [(google.api.field_behavior) = OPTIONAL]; + } + + // The format of the delivered message to the push endpoint is defined by + // the chosen wrapper. When unset, `PubsubWrapper` is used. + oneof wrapper { + // Optional. When set, the payload to the push endpoint is in the form of + // the JSON representation of a PubsubMessage + // (https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#pubsubmessage). + PubsubWrapper pubsub_wrapper = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. When set, the payload to the push endpoint is not wrapped. + NoWrapper no_wrapper = 5 [(google.api.field_behavior) = OPTIONAL]; + } +} + +// Configuration for a BigQuery subscription. +message BigQueryConfig { + // Possible states for a BigQuery subscription. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // The subscription can actively send messages to BigQuery + ACTIVE = 1; + + // Cannot write to the BigQuery table because of permission denied errors. + // This can happen if + // - Pub/Sub SA has not been granted the [appropriate BigQuery IAM + // permissions](https://cloud.google.com/pubsub/docs/create-subscription#assign_bigquery_service_account) + // - bigquery.googleapis.com API is not enabled for the project + // ([instructions](https://cloud.google.com/service-usage/docs/enable-disable)) + PERMISSION_DENIED = 2; + + // Cannot write to the BigQuery table because it does not exist. + NOT_FOUND = 3; + + // Cannot write to the BigQuery table due to a schema mismatch. + SCHEMA_MISMATCH = 4; + + // Cannot write to the destination because enforce_in_transit is set to true + // and the destination locations are not in the allowed regions. + IN_TRANSIT_LOCATION_RESTRICTION = 5; + + // Cannot write to the BigQuery table because the table is not in the same + // location as where Vertex AI models used in `message_transform`s are + // deployed. + VERTEX_AI_LOCATION_RESTRICTION = 6; + } + + // Optional. The name of the table to which to write data, of the form + // {projectId}.{datasetId}.{tableId} + string table = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. When true, use the topic's schema as the columns to write to in + // BigQuery, if it exists. `use_topic_schema` and `use_table_schema` cannot be + // enabled at the same time. + bool use_topic_schema = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. When true, write the subscription name, message_id, publish_time, + // attributes, and ordering_key to additional columns in the table. The + // subscription name, message_id, and publish_time fields are put in their own + // columns while all other message properties (other than data) are written to + // a JSON object in the attributes column. + bool write_metadata = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. When true and use_topic_schema is true, any fields that are a + // part of the topic schema that are not part of the BigQuery table schema are + // dropped when writing to BigQuery. Otherwise, the schemas must be kept in + // sync and any messages with extra fields are not written and remain in the + // subscription's backlog. + bool drop_unknown_fields = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Output only. An output-only field that indicates whether or not the + // subscription can receive messages. + State state = 5 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Optional. When true, use the BigQuery table's schema as the columns to + // write to in BigQuery. `use_table_schema` and `use_topic_schema` cannot be + // enabled at the same time. + bool use_table_schema = 6 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The service account to use to write to BigQuery. The subscription + // creator or updater that specifies this field must have + // `iam.serviceAccounts.actAs` permission on the service account. If not + // specified, the Pub/Sub [service + // agent](https://cloud.google.com/iam/docs/service-agents), + // service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used. + string service_account_email = 7 [(google.api.field_behavior) = OPTIONAL]; +} + +// Configuration for a Bigtable subscription. The Pub/Sub message will be +// written to a Bigtable row as follows: +// - row key: subscription name and message ID delimited by #. +// - columns: message bytes written to a single column family "data" with an +// empty-string column qualifier. +// - cell timestamp: the message publish timestamp. +message BigtableConfig { + // Possible states for a Bigtable subscription. + // Note: more states could be added in the future. Please code accordingly. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // The subscription can actively send messages to Bigtable. + ACTIVE = 1; + + // Cannot write to Bigtable because the instance, table, or app profile + // does not exist. + NOT_FOUND = 2; + + // Cannot write to Bigtable because the app profile is not configured for + // single-cluster routing. + APP_PROFILE_MISCONFIGURED = 3; + + // Cannot write to Bigtable because of permission denied errors. + // This can happen if: + // - The Pub/Sub service agent has not been granted the + // [appropriate Bigtable IAM permission + // bigtable.tables.mutateRows]({$universe.dns_names.final_documentation_domain}/bigtable/docs/access-control#permissions) + // - The bigtable.googleapis.com API is not enabled for the project + // ([instructions]({$universe.dns_names.final_documentation_domain}/service-usage/docs/enable-disable)) + PERMISSION_DENIED = 4; + + // Cannot write to Bigtable because of a missing column family ("data") or + // if there is no structured row key for the subscription name + message ID. + SCHEMA_MISMATCH = 5; + + // Cannot write to the destination because enforce_in_transit is set to true + // and the destination locations are not in the allowed regions. + IN_TRANSIT_LOCATION_RESTRICTION = 6; + + // Cannot write to Bigtable because the table is not in the same location as + // where Vertex AI models used in `message_transform`s are deployed. + VERTEX_AI_LOCATION_RESTRICTION = 7; + } + + // Optional. The unique name of the table to write messages to. + // + // Values are of the form + // `projects//instances//tables/
`. + string table = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The app profile to use for the Bigtable writes. If not specified, + // the "default" application profile will be used. The app profile must use + // single-cluster routing. + string app_profile_id = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The service account to use to write to Bigtable. The subscription + // creator or updater that specifies this field must have + // `iam.serviceAccounts.actAs` permission on the service account. If not + // specified, the Pub/Sub [service + // agent](https://cloud.google.com/iam/docs/service-agents), + // service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used. + string service_account_email = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. When true, write the subscription name, message_id, publish_time, + // attributes, and ordering_key to additional columns in the table under the + // pubsub_metadata column family. The subscription name, message_id, and + // publish_time fields are put in their own columns while all other message + // properties (other than data) are written to a JSON object in the attributes + // column. + bool write_metadata = 5 [(google.api.field_behavior) = OPTIONAL]; + + // Output only. An output-only field that indicates whether or not the + // subscription can receive messages. + State state = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; +} + +// Configuration for a Cloud Storage subscription. +message CloudStorageConfig { + // Configuration for writing message data in text format. + // Message payloads will be written to files as raw text, separated by a + // newline. + message TextConfig {} + + // Configuration for writing message data in Avro format. + // Message payloads and metadata will be written to files as an Avro binary. + message AvroConfig { + // Optional. When true, write the subscription name, message_id, + // publish_time, attributes, and ordering_key as additional fields in the + // output. The subscription name, message_id, and publish_time fields are + // put in their own fields while all other message properties other than + // data (for example, an ordering_key, if present) are added as entries in + // the attributes map. + bool write_metadata = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. When true, the output Cloud Storage file will be serialized + // using the topic schema, if it exists. + bool use_topic_schema = 2 [(google.api.field_behavior) = OPTIONAL]; + } + + // Possible states for a Cloud Storage subscription. + enum State { + // Default value. This value is unused. + STATE_UNSPECIFIED = 0; + + // The subscription can actively send messages to Cloud Storage. + ACTIVE = 1; + + // Cannot write to the Cloud Storage bucket because of permission denied + // errors. + PERMISSION_DENIED = 2; + + // Cannot write to the Cloud Storage bucket because it does not exist. + NOT_FOUND = 3; + + // Cannot write to the destination because enforce_in_transit is set to true + // and the destination locations are not in the allowed regions. + IN_TRANSIT_LOCATION_RESTRICTION = 4; + + // Cannot write to the Cloud Storage bucket due to an incompatibility + // between the topic schema and subscription settings. + SCHEMA_MISMATCH = 5; + + // Cannot write to the Cloud Storage bucket because the bucket is not in the + // same location as where Vertex AI models used in `message_transform`s are + // deployed. + VERTEX_AI_LOCATION_RESTRICTION = 6; + } + + // Required. User-provided name for the Cloud Storage bucket. + // The bucket must be created by the user. The bucket name must be without + // any prefix like "gs://". See the [bucket naming + // requirements] (https://cloud.google.com/storage/docs/buckets#naming). + string bucket = 1 [(google.api.field_behavior) = REQUIRED]; + + // Optional. User-provided prefix for Cloud Storage filename. See the [object + // naming requirements](https://cloud.google.com/storage/docs/objects#naming). + string filename_prefix = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. User-provided suffix for Cloud Storage filename. See the [object + // naming requirements](https://cloud.google.com/storage/docs/objects#naming). + // Must not end in "/". + string filename_suffix = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. User-provided format string specifying how to represent datetimes + // in Cloud Storage filenames. See the [datetime format + // guidance](https://cloud.google.com/pubsub/docs/create-cloudstorage-subscription#file_names). + string filename_datetime_format = 10 [(google.api.field_behavior) = OPTIONAL]; + + // Defaults to text format. + oneof output_format { + // Optional. If set, message data will be written to Cloud Storage in text + // format. + TextConfig text_config = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If set, message data will be written to Cloud Storage in Avro + // format. + AvroConfig avro_config = 5 [(google.api.field_behavior) = OPTIONAL]; + } + + // Optional. The maximum duration that can elapse before a new Cloud Storage + // file is created. Min 1 minute, max 10 minutes, default 5 minutes. May not + // exceed the subscription's acknowledgment deadline. + google.protobuf.Duration max_duration = 6 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The maximum bytes that can be written to a Cloud Storage file + // before a new file is created. Min 1 KB, max 10 GiB. The max_bytes limit may + // be exceeded in cases where messages are larger than the limit. + int64 max_bytes = 7 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The maximum number of messages that can be written to a Cloud + // Storage file before a new file is created. Min 1000 messages. + int64 max_messages = 8 [(google.api.field_behavior) = OPTIONAL]; + + // Output only. An output-only field that indicates whether or not the + // subscription can receive messages. + State state = 9 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Optional. The service account to use to write to Cloud Storage. The + // subscription creator or updater that specifies this field must have + // `iam.serviceAccounts.actAs` permission on the service account. If not + // specified, the Pub/Sub + // [service agent](https://cloud.google.com/iam/docs/service-agents), + // service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used. + string service_account_email = 11 [(google.api.field_behavior) = OPTIONAL]; +} + +// A message and its corresponding acknowledgment ID. +message ReceivedMessage { + // Optional. This ID can be used to acknowledge the received message. + string ack_id = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The message. + PubsubMessage message = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The approximate number of times that Pub/Sub has attempted to + // deliver the associated message to a subscriber. + // + // More precisely, this is 1 + (number of NACKs) + + // (number of ack_deadline exceeds) for this message. + // + // A NACK is any call to ModifyAckDeadline with a 0 deadline. An ack_deadline + // exceeds event is whenever a message is not acknowledged within + // ack_deadline. Note that ack_deadline is initially + // Subscription.ackDeadlineSeconds, but may get extended automatically by + // the client library. + // + // Upon the first delivery of a given message, `delivery_attempt` will have a + // value of 1. The value is calculated at best effort and is approximate. + // + // If a DeadLetterPolicy is not set on the subscription, this will be 0. + int32 delivery_attempt = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the GetSubscription method. +message GetSubscriptionRequest { + // Required. The name of the subscription to get. + // Format is `projects/{project}/subscriptions/{sub}`. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; +} + +// Request for the UpdateSubscription method. +message UpdateSubscriptionRequest { + // Required. The updated subscription object. + Subscription subscription = 1 [(google.api.field_behavior) = REQUIRED]; + + // Required. Indicates which fields in the provided subscription to update. + // Must be specified and non-empty. + google.protobuf.FieldMask update_mask = 2 + [(google.api.field_behavior) = REQUIRED]; +} + +// Request for the `ListSubscriptions` method. +message ListSubscriptionsRequest { + // Required. The name of the project in which to list subscriptions. + // Format is `projects/{project-id}`. + string project = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "cloudresourcemanager.googleapis.com/Project" + } + ]; + + // Optional. Maximum number of subscriptions to return. + int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The value returned by the last `ListSubscriptionsResponse`; + // indicates that this is a continuation of a prior `ListSubscriptions` call, + // and that the system should return the next page of data. + string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for the `ListSubscriptions` method. +message ListSubscriptionsResponse { + // Optional. The subscriptions that match the request. + repeated Subscription subscriptions = 1 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If not empty, indicates that there may be more subscriptions that + // match the request; this value should be passed in a new + // `ListSubscriptionsRequest` to get more subscriptions. + string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the DeleteSubscription method. +message DeleteSubscriptionRequest { + // Required. The subscription to delete. + // Format is `projects/{project}/subscriptions/{sub}`. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; +} + +// Request for the ModifyPushConfig method. +message ModifyPushConfigRequest { + // Required. The name of the subscription. + // Format is `projects/{project}/subscriptions/{sub}`. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; + + // Required. The push configuration for future deliveries. + // + // An empty `pushConfig` indicates that the Pub/Sub system should + // stop pushing messages from the given subscription and allow + // messages to be pulled and acknowledged - effectively pausing + // the subscription if `Pull` or `StreamingPull` is not called. + PushConfig push_config = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// Request for the `Pull` method. +message PullRequest { + // Required. The subscription from which messages should be pulled. + // Format is `projects/{project}/subscriptions/{sub}`. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; + + // Optional. If this field set to true, the system will respond immediately + // even if it there are no messages available to return in the `Pull` + // response. Otherwise, the system may wait (for a bounded amount of time) + // until at least one message is available, rather than returning no messages. + // Warning: setting this field to `true` is discouraged because it adversely + // impacts the performance of `Pull` operations. We recommend that users do + // not set this field. + bool return_immediately = 2 + [deprecated = true, (google.api.field_behavior) = OPTIONAL]; + + // Required. The maximum number of messages to return for this request. Must + // be a positive integer. The Pub/Sub system may return fewer than the number + // specified. + int32 max_messages = 3 [(google.api.field_behavior) = REQUIRED]; +} + +// Response for the `Pull` method. +message PullResponse { + // Optional. Received Pub/Sub messages. The list will be empty if there are no + // more messages available in the backlog, or if no messages could be returned + // before the request timeout. For JSON, the response can be entirely + // empty. The Pub/Sub system may return fewer than the `maxMessages` requested + // even if there are more messages available in the backlog. + repeated ReceivedMessage received_messages = 1 + [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the ModifyAckDeadline method. +message ModifyAckDeadlineRequest { + // Required. The name of the subscription. + // Format is `projects/{project}/subscriptions/{sub}`. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; + + // Required. List of acknowledgment IDs. + repeated string ack_ids = 4 [(google.api.field_behavior) = REQUIRED]; + + // Required. The new ack deadline with respect to the time this request was + // sent to the Pub/Sub system. For example, if the value is 10, the new ack + // deadline will expire 10 seconds after the `ModifyAckDeadline` call was + // made. Specifying zero might immediately make the message available for + // delivery to another subscriber client. This typically results in an + // increase in the rate of message redeliveries (that is, duplicates). + // The minimum deadline you can specify is 0 seconds. + // The maximum deadline you can specify in a single request is 600 seconds + // (10 minutes). + int32 ack_deadline_seconds = 3 [(google.api.field_behavior) = REQUIRED]; +} + +// Request for the Acknowledge method. +message AcknowledgeRequest { + // Required. The subscription whose message is being acknowledged. + // Format is `projects/{project}/subscriptions/{sub}`. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; + + // Required. The acknowledgment ID for the messages being acknowledged that + // was returned by the Pub/Sub system in the `Pull` response. Must not be + // empty. + repeated string ack_ids = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// Request for the `StreamingPull` streaming RPC method. This request is used to +// establish the initial stream as well as to stream acknowledgments and ack +// deadline modifications from the client to the server. +message StreamingPullRequest { + // Required. The subscription for which to initialize the new stream. This + // must be provided in the first request on the stream, and must not be set in + // subsequent requests from client to server. + // Format is `projects/{project}/subscriptions/{sub}`. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; + + // Optional. List of acknowledgment IDs for acknowledging previously received + // messages (received on this stream or a different stream). If an ack ID has + // expired, the corresponding message may be redelivered later. Acknowledging + // a message more than once will not result in an error. If the acknowledgment + // ID is malformed, the stream will be aborted with status `INVALID_ARGUMENT`. + repeated string ack_ids = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The list of new ack deadlines for the IDs listed in + // `modify_deadline_ack_ids`. The size of this list must be the same as the + // size of `modify_deadline_ack_ids`. If it differs the stream will be aborted + // with `INVALID_ARGUMENT`. Each element in this list is applied to the + // element in the same position in `modify_deadline_ack_ids`. The new ack + // deadline is with respect to the time this request was sent to the Pub/Sub + // system. Must be >= 0. For example, if the value is 10, the new ack deadline + // will expire 10 seconds after this request is received. If the value is 0, + // the message is immediately made available for another streaming or + // non-streaming pull request. If the value is < 0 (an error), the stream will + // be aborted with status `INVALID_ARGUMENT`. + repeated int32 modify_deadline_seconds = 3 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. List of acknowledgment IDs whose deadline will be modified based + // on the corresponding element in `modify_deadline_seconds`. This field can + // be used to indicate that more time is needed to process a message by the + // subscriber, or to make the message available for redelivery if the + // processing was interrupted. + repeated string modify_deadline_ack_ids = 4 + [(google.api.field_behavior) = OPTIONAL]; + + // Required. The ack deadline to use for the stream. This must be provided in + // the first request on the stream, but it can also be updated on subsequent + // requests from client to server. The minimum deadline you can specify is 10 + // seconds. The maximum deadline you can specify is 600 seconds (10 minutes). + int32 stream_ack_deadline_seconds = 5 + [(google.api.field_behavior) = REQUIRED]; + + // Optional. A unique identifier that is used to distinguish client instances + // from each other. Only needs to be provided on the initial request. When a + // stream disconnects and reconnects for the same stream, the client_id should + // be set to the same value so that state associated with the old stream can + // be transferred to the new stream. The same client_id should not be used for + // different client instances. + string client_id = 6 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Flow control settings for the maximum number of outstanding + // messages. When there are `max_outstanding_messages` currently sent to the + // streaming pull client that have not yet been acked or nacked, the server + // stops sending more messages. The sending of messages resumes once the + // number of outstanding messages is less than this value. If the value is + // <= 0, there is no limit to the number of outstanding messages. This + // property can only be set on the initial StreamingPullRequest. If it is set + // on a subsequent request, the stream will be aborted with status + // `INVALID_ARGUMENT`. + int64 max_outstanding_messages = 7 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Flow control settings for the maximum number of outstanding + // bytes. When there are `max_outstanding_bytes` or more worth of messages + // currently sent to the streaming pull client that have not yet been acked or + // nacked, the server will stop sending more messages. The sending of messages + // resumes once the number of outstanding bytes is less than this value. If + // the value is <= 0, there is no limit to the number of outstanding bytes. + // This property can only be set on the initial StreamingPullRequest. If it is + // set on a subsequent request, the stream will be aborted with status + // `INVALID_ARGUMENT`. + int64 max_outstanding_bytes = 8 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The protocol version used by the client. This property can only + // be set on the initial StreamingPullRequest. If it is set on a subsequent + // request, the stream will be aborted with status `INVALID_ARGUMENT`. + int64 protocol_version = 10 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for the `StreamingPull` method. This response is used to stream +// messages from the server to the client. +message StreamingPullResponse { + // Acknowledgment IDs sent in one or more previous requests to acknowledge a + // previously received message. + message AcknowledgeConfirmation { + // Optional. Successfully processed acknowledgment IDs. + repeated string ack_ids = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. List of acknowledgment IDs that were malformed or whose + // acknowledgment deadline has expired. + repeated string invalid_ack_ids = 2 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. List of acknowledgment IDs that were out of order. + repeated string unordered_ack_ids = 3 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. List of acknowledgment IDs that failed processing with + // temporary issues. + repeated string temporary_failed_ack_ids = 4 + [(google.api.field_behavior) = OPTIONAL]; + } + + // Acknowledgment IDs sent in one or more previous requests to modify the + // deadline for a specific message. + message ModifyAckDeadlineConfirmation { + // Optional. Successfully processed acknowledgment IDs. + repeated string ack_ids = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. List of acknowledgment IDs that were malformed or whose + // acknowledgment deadline has expired. + repeated string invalid_ack_ids = 2 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. List of acknowledgment IDs that failed processing with + // temporary issues. + repeated string temporary_failed_ack_ids = 3 + [(google.api.field_behavior) = OPTIONAL]; + } + + // Subscription properties sent as part of the response. + message SubscriptionProperties { + // Optional. True iff exactly once delivery is enabled for this + // subscription. + bool exactly_once_delivery_enabled = 1 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. True iff message ordering is enabled for this subscription. + bool message_ordering_enabled = 2 [(google.api.field_behavior) = OPTIONAL]; + } + + // Optional. Received Pub/Sub messages. + repeated ReceivedMessage received_messages = 1 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. This field will only be set if `enable_exactly_once_delivery` is + // set to `true` and is not guaranteed to be populated. + AcknowledgeConfirmation acknowledge_confirmation = 5 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. This field will only be set if `enable_exactly_once_delivery` is + // set to `true` and is not guaranteed to be populated. + ModifyAckDeadlineConfirmation modify_ack_deadline_confirmation = 3 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Properties associated with this subscription. + SubscriptionProperties subscription_properties = 4 + [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the `CreateSnapshot` method. +message CreateSnapshotRequest { + // Required. User-provided name for this snapshot. If the name is not provided + // in the request, the server will assign a random name for this snapshot on + // the same project as the subscription. Note that for REST API requests, you + // must specify a name. See the [resource name + // rules](https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). + // Format is `projects/{project}/snapshots/{snap}`. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Snapshot" } + ]; + + // Required. The subscription whose backlog the snapshot retains. + // Specifically, the created snapshot is guaranteed to retain: + // (a) The existing backlog on the subscription. More precisely, this is + // defined as the messages in the subscription's backlog that are + // unacknowledged upon the successful completion of the + // `CreateSnapshot` request; as well as: + // (b) Any messages published to the subscription's topic following the + // successful completion of the CreateSnapshot request. + // Format is `projects/{project}/subscriptions/{sub}`. + string subscription = 2 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; + + // Optional. See [Creating and managing + // labels](https://cloud.google.com/pubsub/docs/labels). + map labels = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Input only. Immutable. Tag keys/values directly bound to this + // resource. For example: + // "123/environment": "production", + // "123/costCenter": "marketing" + // See https://docs.cloud.google.com/pubsub/docs/tags for more information on + // using tags with Pub/Sub resources. + map tags = 4 [ + (google.api.field_behavior) = INPUT_ONLY, + (google.api.field_behavior) = IMMUTABLE, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// Request for the UpdateSnapshot method. +message UpdateSnapshotRequest { + // Required. The updated snapshot object. + Snapshot snapshot = 1 [(google.api.field_behavior) = REQUIRED]; + + // Required. Indicates which fields in the provided snapshot to update. + // Must be specified and non-empty. + google.protobuf.FieldMask update_mask = 2 + [(google.api.field_behavior) = REQUIRED]; +} + +// A snapshot resource. Snapshots are used in +// [Seek](https://cloud.google.com/pubsub/docs/replay-overview) +// operations, which allow you to manage message acknowledgments in bulk. That +// is, you can set the acknowledgment state of messages in an existing +// subscription to the state captured by a snapshot. +message Snapshot { + option (google.api.resource) = { + type: "pubsub.googleapis.com/Snapshot" + pattern: "projects/{project}/snapshots/{snapshot}" + plural: "snapshots" + singular: "snapshot" + }; + + // Optional. The name of the snapshot. + string name = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The name of the topic from which this snapshot is retaining + // messages. + string topic = 2 [ + (google.api.field_behavior) = OPTIONAL, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" } + ]; + + // Optional. The snapshot is guaranteed to exist up until this time. + // A newly-created snapshot expires no later than 7 days from the time of its + // creation. Its exact lifetime is determined at creation by the existing + // backlog in the source subscription. Specifically, the lifetime of the + // snapshot is `7 days - (age of oldest unacked message in the subscription)`. + // For example, consider a subscription whose oldest unacked message is 3 days + // old. If a snapshot is created from this subscription, the snapshot -- which + // will always capture this 3-day-old backlog as long as the snapshot + // exists -- will expire in 4 days. The service will refuse to create a + // snapshot that would expire in less than 1 hour after creation. + google.protobuf.Timestamp expire_time = 3 + [(google.api.field_behavior) = OPTIONAL]; + + // Optional. See [Creating and managing labels] + // (https://cloud.google.com/pubsub/docs/labels). + map labels = 4 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the GetSnapshot method. +message GetSnapshotRequest { + // Required. The name of the snapshot to get. + // Format is `projects/{project}/snapshots/{snap}`. + string snapshot = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Snapshot" } + ]; +} + +// Request for the `ListSnapshots` method. +message ListSnapshotsRequest { + // Required. The name of the project in which to list snapshots. + // Format is `projects/{project-id}`. + string project = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "cloudresourcemanager.googleapis.com/Project" + } + ]; + + // Optional. Maximum number of snapshots to return. + int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The value returned by the last `ListSnapshotsResponse`; indicates + // that this is a continuation of a prior `ListSnapshots` call, and that the + // system should return the next page of data. + string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for the `ListSnapshots` method. +message ListSnapshotsResponse { + // Optional. The resulting snapshots. + repeated Snapshot snapshots = 1 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. If not empty, indicates that there may be more snapshot that + // match the request; this value should be passed in a new + // `ListSnapshotsRequest`. + string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL]; +} + +// Request for the `DeleteSnapshot` method. +message DeleteSnapshotRequest { + // Required. The name of the snapshot to delete. + // Format is `projects/{project}/snapshots/{snap}`. + string snapshot = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Snapshot" } + ]; +} + +// Request for the `Seek` method. +message SeekRequest { + // Required. The subscription to affect. + string subscription = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Subscription" + } + ]; + + oneof target { + // Optional. The time to seek to. + // Messages retained in the subscription that were published before this + // time are marked as acknowledged, and messages retained in the + // subscription that were published after this time are marked as + // unacknowledged. Note that this operation affects only those messages + // retained in the subscription (configured by the combination of + // `message_retention_duration` and `retain_acked_messages`). For example, + // if `time` corresponds to a point before the message retention + // window (or to a point before the system's notion of the subscription + // creation time), only retained messages will be marked as unacknowledged, + // and already-expunged messages will not be restored. + google.protobuf.Timestamp time = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. The snapshot to seek to. The snapshot's topic must be the same + // as that of the provided subscription. Format is + // `projects/{project}/snapshots/{snap}`. + string snapshot = 3 [ + (google.api.field_behavior) = OPTIONAL, + (google.api.resource_reference) = { + type: "pubsub.googleapis.com/Snapshot" + } + ]; + } +} + +// Response for the `Seek` method (this response is empty). +message SeekResponse {} diff --git a/pkgs/google_cloud_pubsub/protos/google/pubsub/v1/schema.proto b/pkgs/google_cloud_pubsub/protos/google/pubsub/v1/schema.proto new file mode 100644 index 00000000..48a6b2ae --- /dev/null +++ b/pkgs/google_cloud_pubsub/protos/google/pubsub/v1/schema.proto @@ -0,0 +1,409 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.pubsub.v1; + +import "google/api/annotations.proto"; +import "google/api/client.proto"; +import "google/api/field_behavior.proto"; +import "google/api/resource.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + +option csharp_namespace = "Google.Cloud.PubSub.V1"; +option go_package = "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb;pubsubpb"; +option java_multiple_files = true; +option java_outer_classname = "SchemaProto"; +option java_package = "com.google.pubsub.v1"; +option php_namespace = "Google\\Cloud\\PubSub\\V1"; +option ruby_package = "Google::Cloud::PubSub::V1"; + +// Service for doing schema-related operations. +service SchemaService { + option (google.api.default_host) = "pubsub.googleapis.com"; + option (google.api.oauth_scopes) = + "https://www.googleapis.com/auth/cloud-platform," + "https://www.googleapis.com/auth/pubsub"; + + // Creates a schema. + rpc CreateSchema(CreateSchemaRequest) returns (Schema) { + option (google.api.http) = { + post: "/v1/{parent=projects/*}/schemas" + body: "schema" + }; + option (google.api.method_signature) = "parent,schema,schema_id"; + } + + // Gets a schema. + rpc GetSchema(GetSchemaRequest) returns (Schema) { + option (google.api.http) = { + get: "/v1/{name=projects/*/schemas/*}" + }; + option (google.api.method_signature) = "name"; + } + + // Lists schemas in a project. + rpc ListSchemas(ListSchemasRequest) returns (ListSchemasResponse) { + option (google.api.http) = { + get: "/v1/{parent=projects/*}/schemas" + }; + option (google.api.method_signature) = "parent"; + } + + // Lists all schema revisions for the named schema. + rpc ListSchemaRevisions(ListSchemaRevisionsRequest) + returns (ListSchemaRevisionsResponse) { + option (google.api.http) = { + get: "/v1/{name=projects/*/schemas/*}:listRevisions" + }; + option (google.api.method_signature) = "name"; + } + + // Commits a new schema revision to an existing schema. + rpc CommitSchema(CommitSchemaRequest) returns (Schema) { + option (google.api.http) = { + post: "/v1/{name=projects/*/schemas/*}:commit" + body: "*" + }; + option (google.api.method_signature) = "name,schema"; + } + + // Creates a new schema revision that is a copy of the provided revision_id. + rpc RollbackSchema(RollbackSchemaRequest) returns (Schema) { + option (google.api.http) = { + post: "/v1/{name=projects/*/schemas/*}:rollback" + body: "*" + }; + option (google.api.method_signature) = "name,revision_id"; + } + + // Deletes a specific schema revision. + rpc DeleteSchemaRevision(DeleteSchemaRevisionRequest) returns (Schema) { + option (google.api.http) = { + delete: "/v1/{name=projects/*/schemas/*}:deleteRevision" + }; + option (google.api.method_signature) = "name,revision_id"; + } + + // Deletes a schema. + rpc DeleteSchema(DeleteSchemaRequest) returns (google.protobuf.Empty) { + option (google.api.http) = { + delete: "/v1/{name=projects/*/schemas/*}" + }; + option (google.api.method_signature) = "name"; + } + + // Validates a schema. + rpc ValidateSchema(ValidateSchemaRequest) returns (ValidateSchemaResponse) { + option (google.api.http) = { + post: "/v1/{parent=projects/*}/schemas:validate" + body: "*" + }; + option (google.api.method_signature) = "parent,schema"; + } + + // Validates a message against a schema. + rpc ValidateMessage(ValidateMessageRequest) + returns (ValidateMessageResponse) { + option (google.api.http) = { + post: "/v1/{parent=projects/*}/schemas:validateMessage" + body: "*" + }; + } +} + +// A schema resource. +message Schema { + option (google.api.resource) = { + type: "pubsub.googleapis.com/Schema" + pattern: "projects/{project}/schemas/{schema}" + }; + + // Possible schema definition types. + enum Type { + // Default value. This value is unused. + TYPE_UNSPECIFIED = 0; + + // A Protocol Buffer schema definition. + PROTOCOL_BUFFER = 1; + + // An Avro schema definition. + AVRO = 2; + } + + // Required. Name of the schema. + // Format is `projects/{project}/schemas/{schema}`. + string name = 1 [(google.api.field_behavior) = REQUIRED]; + + // The type of the schema definition. + Type type = 2; + + // The definition of the schema. This should contain a string representing + // the full definition of the schema that is a valid schema definition of + // the type specified in `type`. + string definition = 3; + + // Output only. Immutable. The revision ID of the schema. + string revision_id = 4 [ + (google.api.field_behavior) = IMMUTABLE, + (google.api.field_behavior) = OUTPUT_ONLY + ]; + + // Output only. The timestamp that the revision was created. + google.protobuf.Timestamp revision_create_time = 6 + [(google.api.field_behavior) = OUTPUT_ONLY]; +} + +// View of Schema object fields to be returned by GetSchema and ListSchemas. +enum SchemaView { + // The default / unset value. + // The API will default to the BASIC view. + SCHEMA_VIEW_UNSPECIFIED = 0; + + // Include the name and type of the schema, but not the definition. + BASIC = 1; + + // Include all Schema object fields. + FULL = 2; +} + +// Request for the CreateSchema method. +message CreateSchemaRequest { + // Required. The name of the project in which to create the schema. + // Format is `projects/{project-id}`. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "pubsub.googleapis.com/Schema" + } + ]; + + // Required. The schema object to create. + // + // This schema's `name` parameter is ignored. The schema object returned + // by CreateSchema will have a `name` made using the given `parent` and + // `schema_id`. + Schema schema = 2 [(google.api.field_behavior) = REQUIRED]; + + // The ID to use for the schema, which will become the final component of + // the schema's resource name. + // + // See https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names for + // resource name constraints. + string schema_id = 3; +} + +// Request for the GetSchema method. +message GetSchemaRequest { + // Required. The name of the schema to get. + // Format is `projects/{project}/schemas/{schema}`. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" } + ]; + + // The set of fields to return in the response. If not set, returns a Schema + // with all fields filled out. Set to `BASIC` to omit the `definition`. + SchemaView view = 2; +} + +// Request for the `ListSchemas` method. +message ListSchemasRequest { + // Required. The name of the project in which to list schemas. + // Format is `projects/{project-id}`. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "cloudresourcemanager.googleapis.com/Project" + } + ]; + + // The set of Schema fields to return in the response. If not set, returns + // Schemas with `name` and `type`, but not `definition`. Set to `FULL` to + // retrieve all fields. + SchemaView view = 2; + + // Maximum number of schemas to return. + int32 page_size = 3; + + // The value returned by the last `ListSchemasResponse`; indicates that + // this is a continuation of a prior `ListSchemas` call, and that the + // system should return the next page of data. + string page_token = 4; +} + +// Response for the `ListSchemas` method. +message ListSchemasResponse { + // The resulting schemas. + repeated Schema schemas = 1; + + // If not empty, indicates that there may be more schemas that match the + // request; this value should be passed in a new `ListSchemasRequest`. + string next_page_token = 2; +} + +// Request for the `ListSchemaRevisions` method. +message ListSchemaRevisionsRequest { + // Required. The name of the schema to list revisions for. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" } + ]; + + // The set of Schema fields to return in the response. If not set, returns + // Schemas with `name` and `type`, but not `definition`. Set to `FULL` to + // retrieve all fields. + SchemaView view = 2; + + // The maximum number of revisions to return per page. + int32 page_size = 3; + + // The page token, received from a previous ListSchemaRevisions call. + // Provide this to retrieve the subsequent page. + string page_token = 4; +} + +// Response for the `ListSchemaRevisions` method. +message ListSchemaRevisionsResponse { + // The revisions of the schema. + repeated Schema schemas = 1; + + // A token that can be sent as `page_token` to retrieve the next page. + // If this field is empty, there are no subsequent pages. + string next_page_token = 2; +} + +// Request for CommitSchema method. +message CommitSchemaRequest { + // Required. The name of the schema we are revising. + // Format is `projects/{project}/schemas/{schema}`. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" } + ]; + + // Required. The schema revision to commit. + Schema schema = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// Request for the `RollbackSchema` method. +message RollbackSchemaRequest { + // Required. The schema being rolled back with revision id. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" } + ]; + + // Required. The revision ID to roll back to. + // It must be a revision of the same schema. + // + // Example: c7cfa2a8 + string revision_id = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// Request for the `DeleteSchemaRevision` method. +message DeleteSchemaRevisionRequest { + // Required. The name of the schema revision to be deleted, with a revision ID + // explicitly included. + // + // Example: `projects/123/schemas/my-schema@c7cfa2a8` + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" } + ]; + + // Optional. This field is deprecated and should not be used for specifying + // the revision ID. The revision ID should be specified via the `name` + // parameter. + string revision_id = 2 + [deprecated = true, (google.api.field_behavior) = OPTIONAL]; +} + +// Request for the `DeleteSchema` method. +message DeleteSchemaRequest { + // Required. Name of the schema to delete. + // Format is `projects/{project}/schemas/{schema}`. + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" } + ]; +} + +// Request for the `ValidateSchema` method. +message ValidateSchemaRequest { + // Required. The name of the project in which to validate schemas. + // Format is `projects/{project-id}`. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "cloudresourcemanager.googleapis.com/Project" + } + ]; + + // Required. The schema object to validate. + Schema schema = 2 [(google.api.field_behavior) = REQUIRED]; +} + +// Response for the `ValidateSchema` method. +// Empty for now. +message ValidateSchemaResponse {} + +// Request for the `ValidateMessage` method. +message ValidateMessageRequest { + // Required. The name of the project in which to validate schemas. + // Format is `projects/{project-id}`. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "cloudresourcemanager.googleapis.com/Project" + } + ]; + + oneof schema_spec { + // Name of the schema against which to validate. + // + // Format is `projects/{project}/schemas/{schema}`. + string name = 2 [ + (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" } + ]; + + // Ad-hoc schema against which to validate + Schema schema = 3; + } + + // Message to validate against the provided `schema_spec`. + bytes message = 4; + + // The encoding expected for messages + Encoding encoding = 5; +} + +// Response for the `ValidateMessage` method. +// Empty for now. +message ValidateMessageResponse {} + +// Possible encoding types for messages. +enum Encoding { + // Unspecified + ENCODING_UNSPECIFIED = 0; + + // JSON encoding + JSON = 1; + + // Binary encoding, as defined by the schema type. For some schema types, + // binary encoding may not be available. + BINARY = 2; +} diff --git a/pkgs/google_cloud_pubsub/pubspec.yaml b/pkgs/google_cloud_pubsub/pubspec.yaml index de9f273c..724da107 100644 --- a/pkgs/google_cloud_pubsub/pubspec.yaml +++ b/pkgs/google_cloud_pubsub/pubspec.yaml @@ -23,4 +23,5 @@ dependencies: protobuf: ^4.1.0 dev_dependencies: + protoc_plugin: ^22.0.0 test: ^1.24.0 diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart index 34811dbc..f30b26d2 100644 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -1,19 +1,29 @@ +@Tags(['google-cloud']) +import 'dart:convert'; +import 'dart:io'; + import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; import 'package:test/test.dart'; -import 'dart:io'; -import 'dart:convert'; void main() { group('PubSub Integration', () { PubSub? client; - setUp(() { + setUp(() async { final host = Platform.environment['PUBSUB_EMULATOR_HOST']; - if (host == null) { - markTestSkipped('PUBSUB_EMULATOR_HOST environment variable not set'); + final project = Platform.environment['GOOGLE_CLOUD_PROJECT']; + + if (host != null) { + client = PubSub(projectId: 'test-project'); + } else if (project != null) { + client = PubSub(projectId: project); + } else { + markTestSkipped( + 'Neither PUBSUB_EMULATOR_HOST nor GOOGLE_CLOUD_PROJECT ' + 'environment variable set', + ); return; } - client = PubSub(projectId: 'test-project'); }); tearDown(() async { @@ -28,13 +38,211 @@ void main() { // Create topic await topic.create(); + addTearDown(() async => await topic.delete()); // Publish message final messageId = await topic.publish(utf8.encode('Hello World')); expect(messageId, isNotNull); // Delete topic + expect(await topic.delete(), isTrue); + }); + + test('Delete non-existent topic returns false', () async { + if (client == null) return; // Skipped + + final topic = client!.topic( + 'non-existent-${DateTime.now().millisecondsSinceEpoch}', + ); + final deleted = await topic.delete(); + expect(deleted, isFalse); + }); + + test('create existing topic throws TopicAlreadyExistsException', () async { + if (client == null) return; // Skipped + + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + expect(topic.create(), throwsA(isA())); + await topic.delete(); }); + + test( + 'create existing subscription throws SubscriptionAlreadyExistsException', + () async { + if (client == null) return; // Skipped + + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + await subscription.create(topic: topicName); + addTearDown(() async => await subscription.delete()); + + expect( + () => subscription.create(topic: topicName), + throwsA(isA()), + ); + + await subscription.delete(); + await topic.delete(); + }, + ); + + test('create subscription for non-existent topic throws ' + 'TopicNotFoundException', () async { + if (client == null) return; // Skipped + + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client!.subscription(subscriptionName); + + expect( + () => subscription.create(topic: 'non-existent-topic'), + throwsA(isA()), + ); + }); + + test( + 'publish to non-existent topic throws TopicNotFoundException', + () async { + if (client == null) return; // Skipped + + final topicName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + + expect( + () => topic.publish(utf8.encode('Hello')), + throwsA(isA()), + ); + }, + ); + + test('pull from non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + if (client == null) return; // Skipped + + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client!.subscription(subscriptionName); + + expect(subscription.pull, throwsA(isA())); + }); + + test('acknowledge for non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + if (client == null) return; // Skipped + + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client!.subscription(subscriptionName); + + expect( + () => subscription.acknowledge(['ack-id']), + throwsA(isA()), + ); + }); + + test('modifyAckDeadline for non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + if (client == null) return; // Skipped + + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client!.subscription(subscriptionName); + + expect( + () => subscription.modifyAckDeadline(['ack-id'], 10), + throwsA(isA()), + ); + }); + + test('publish and pull message', () async { + if (client == null) return; // Skipped + + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topicName); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello PubSub'); + await topic.publish(data); + + // Pull message + final messages = await client!.pull(subscriptionName); + expect(messages, hasLength(1)); + expect(messages.first.message.data, equals(data)); + + // Ack message + await client!.acknowledge(subscriptionName, [messages.first.ackId]); + }); + + test('publish and streaming pull message', () async { + if (client == null) return; // Skipped + + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topicName); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello Streaming PubSub'); + await topic.publish(data); + + // Start streaming pull + final stream = client!.streamingPull(subscriptionName); + + // Use stream.first to get the first message and automatically cancel the stream. + final receivedMessage = await stream.first; + + expect(receivedMessage.message.data, equals(data)); + + // Ack message + await client!.acknowledge(subscriptionName, [receivedMessage.ackId]); + }); + + test('streaming pull throws StreamBrokenException when subscription is deleted', () async { + if (client == null) return; // Skipped + + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topicName); + + // Start streaming pull + final stream = client!.streamingPull(subscriptionName); + + // Delete subscription to break the stream + await subscription.delete(); + + // Expect stream to throw StreamBrokenException + expect(stream.first, throwsA(isA())); + }); }); } diff --git a/pkgs/google_cloud_pubsub/tool/compile_protos.dart b/pkgs/google_cloud_pubsub/tool/compile_protos.dart new file mode 100644 index 00000000..7bd66392 --- /dev/null +++ b/pkgs/google_cloud_pubsub/tool/compile_protos.dart @@ -0,0 +1,44 @@ +import 'dart:io'; + +void main() async { + final protosDir = Directory('protos'); + if (!protosDir.existsSync()) { + print('Protos directory not found! Please run fetch_protos.dart first.'); + exit(1); + } + + print('Compiling protos...'); + final result = Process.runSync('protoc', [ + '--plugin=protoc-gen-dart=tool/protoc-gen-dart.sh', + '--dart_out=grpc:lib/src/generated', + '-I', + 'protos', + 'protos/google/pubsub/v1/pubsub.proto', + 'protos/google/pubsub/v1/schema.proto', + 'protos/google/protobuf/timestamp.proto', + 'protos/google/protobuf/duration.proto', + 'protos/google/protobuf/field_mask.proto', + 'protos/google/protobuf/struct.proto', + 'protos/google/protobuf/empty.proto', + ]); + + print(result.stdout); + print(result.stderr); + + if (result.exitCode != 0) { + print('Failed to compile protos!'); + exit(1); + } + + final generatedDir = Directory('lib/src/generated'); + if (generatedDir.existsSync()) { + final files = generatedDir.listSync(recursive: true); + for (final file in files) { + if (file is File && file.path.endsWith('.pbjson.dart')) { + file.deleteSync(); + } + } + } + + print('Successfully compiled protos!'); +} diff --git a/pkgs/google_cloud_pubsub/tool/fetch_protos.dart b/pkgs/google_cloud_pubsub/tool/fetch_protos.dart new file mode 100644 index 00000000..df037544 --- /dev/null +++ b/pkgs/google_cloud_pubsub/tool/fetch_protos.dart @@ -0,0 +1,68 @@ +import 'dart:io'; +import 'package:http/http.dart' as http; + +const googleapisBase = + 'https://raw.githubusercontent.com/googleapis/googleapis/master'; +const protobufBase = + 'https://raw.githubusercontent.com/protocolbuffers/protobuf/main/src'; + +final filesToFetch = { + '$googleapisBase/google/pubsub/v1/pubsub.proto': + 'google/pubsub/v1/pubsub.proto', + '$googleapisBase/google/pubsub/v1/schema.proto': + 'google/pubsub/v1/schema.proto', + '$googleapisBase/google/api/annotations.proto': + 'google/api/annotations.proto', + '$googleapisBase/google/api/client.proto': 'google/api/client.proto', + '$googleapisBase/google/api/field_behavior.proto': + 'google/api/field_behavior.proto', + '$googleapisBase/google/api/resource.proto': 'google/api/resource.proto', + '$googleapisBase/google/api/http.proto': 'google/api/http.proto', + '$googleapisBase/google/api/launch_stage.proto': + 'google/api/launch_stage.proto', + '$protobufBase/google/protobuf/empty.proto': 'google/protobuf/empty.proto', + '$protobufBase/google/protobuf/timestamp.proto': + 'google/protobuf/timestamp.proto', + '$protobufBase/google/protobuf/duration.proto': + 'google/protobuf/duration.proto', + '$protobufBase/google/protobuf/field_mask.proto': + 'google/protobuf/field_mask.proto', + '$protobufBase/google/protobuf/struct.proto': 'google/protobuf/struct.proto', +}; + +Future fetchFile( + http.Client client, + String url, + String relativePath, +) async { + final file = File('protos/$relativePath'); + file.parent.createSync(recursive: true); + + print('Fetching $url ...'); + final response = await client.get(Uri.parse(url)); + if (response.statusCode == 200) { + await file.writeAsBytes(response.bodyBytes); + return; + } + throw Exception('Failed to fetch $url: ${response.statusCode}'); +} + +void main() async { + final protosDir = Directory('protos'); + if (protosDir.existsSync()) { + protosDir.deleteSync(recursive: true); + } + protosDir.createSync(); + + final client = http.Client(); + try { + final futures = filesToFetch.entries + .map((entry) => fetchFile(client, entry.key, entry.value)) + .toList(); + + await Future.wait(futures); + print('Successfully fetched all protos!'); + } finally { + client.close(); + } +} diff --git a/pkgs/google_cloud_pubsub/tool/protoc-gen-dart.sh b/pkgs/google_cloud_pubsub/tool/protoc-gen-dart.sh new file mode 100755 index 00000000..08c2c0d0 --- /dev/null +++ b/pkgs/google_cloud_pubsub/tool/protoc-gen-dart.sh @@ -0,0 +1,2 @@ +#!/bin/sh +dart run protoc_plugin "$@" From aa7c1812a107c5fa4b8300166fb2d4cda62be6fb Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Mon, 20 Apr 2026 13:02:15 +0000 Subject: [PATCH 03/18] lints --- .../test/integration_test.dart | 57 ++++++++++++------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart index f30b26d2..ed0d4bdd 100644 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -1,4 +1,6 @@ @Tags(['google-cloud']) +library; + import 'dart:convert'; import 'dart:io'; @@ -171,7 +173,9 @@ void main() { if (client == null) return; // Skipped final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-' + '${DateTime.now().millisecondsSinceEpoch}'; final topic = client!.topic(topicName); final subscription = client!.subscription(subscriptionName); @@ -197,7 +201,9 @@ void main() { if (client == null) return; // Skipped final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-' + '${DateTime.now().millisecondsSinceEpoch}'; final topic = client!.topic(topicName); final subscription = client!.subscription(subscriptionName); @@ -212,37 +218,44 @@ void main() { // Start streaming pull final stream = client!.streamingPull(subscriptionName); - - // Use stream.first to get the first message and automatically cancel the stream. + + // Use stream.first to get the first message and automatically cancel the + // stream. final receivedMessage = await stream.first; - + expect(receivedMessage.message.data, equals(data)); - + // Ack message await client!.acknowledge(subscriptionName, [receivedMessage.ackId]); }); - test('streaming pull throws StreamBrokenException when subscription is deleted', () async { - if (client == null) return; // Skipped + test( + 'streaming pull throws StreamBrokenException ' + 'when subscription is deleted', + () async { + if (client == null) return; // Skipped - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - final subscription = client!.subscription(subscriptionName); + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-' + '${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); - await topic.create(); - addTearDown(() async => await topic.delete()); + await topic.create(); + addTearDown(() async => await topic.delete()); - await subscription.create(topic: topicName); + await subscription.create(topic: topicName); - // Start streaming pull - final stream = client!.streamingPull(subscriptionName); + // Start streaming pull + final stream = client!.streamingPull(subscriptionName); - // Delete subscription to break the stream - await subscription.delete(); + // Delete subscription to break the stream + await subscription.delete(); - // Expect stream to throw StreamBrokenException - expect(stream.first, throwsA(isA())); - }); + // Expect stream to throw StreamBrokenException + expect(stream.first, throwsA(isA())); + }, + ); }); } From eda1eaaf632ddbda82cc7709aaad12c31179c26f Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Mon, 20 Apr 2026 13:04:45 +0000 Subject: [PATCH 04/18] update deps diagram --- deps.png | Bin 264691 -> 311993 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/deps.png b/deps.png index 88ae50f2e0d376ec437d4ab989b4f562e40cf638..95c8959cefa7c385a26afdbb7687751b1991caa4 100644 GIT binary patch literal 311993 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 FCipj2%(o|+J?zqU#K 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

cJ{TNpG^^#7& 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 z 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

4s$Ds-cS%ND4JxkGq#5Xai83X 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

1|8?g#m_2k8JuyKzeqI|T75U41_u9*ILMj^G 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�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

dVy#!owa7&; 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 f4G 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 SZ;GMdbwcs1Lc&p Date: Mon, 20 Apr 2026 15:13:12 +0200 Subject: [PATCH 05/18] Update pkgs/google_cloud_pubsub/lib/src/client.dart Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- pkgs/google_cloud_pubsub/lib/src/client.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index e3494b71..ad48323e 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -49,7 +49,7 @@ final class PubSub { String? emulatorHost, ) => switch ((projectId, emulatorHost)) { (final String projectId, _) => projectId, - (null, _?) => '', + (null, _?) => projectFromEnvironment ?? 'test-project', (null, null) => projectFromEnvironment ?? 'unknown-project', }; From 75b154333bf9d3e800576674aa7609a7a315b4d1 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Tue, 21 Apr 2026 13:29:49 +0000 Subject: [PATCH 06/18] work --- pkgs/google_cloud_pubsub/lib/src/client.dart | 76 ++++++++++--------- .../test/integration_test.dart | 43 +++++------ 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index ad48323e..3f78e3c3 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -33,6 +33,7 @@ final class PubSub { grpc.PublisherClient? _publisherClient; grpc.SubscriberClient? _subscriberClient; auth.AutoRefreshingAuthClient? _authClient; + Future? _authClientFuture; Future get _requiredProjectId async { final id = await _projectId; @@ -65,16 +66,10 @@ final class PubSub { } if (emulatorHost case String host) { - var cleanHost = host; - var port = 8085; - if (host.contains(':')) { - final parts = host.split(':'); - cleanHost = parts[0]; - port = int.parse(parts[1]); - } + final uri = Uri.parse('http://$host'); return ClientChannel( - cleanHost, - port: port, + uri.host, + port: uri.hasPort ? uri.port : 8085, options: const ChannelOptions( credentials: ChannelCredentials.insecure(), ), @@ -89,6 +84,17 @@ final class PubSub { PubSub._(this._projectId, this._channel, this._isEmulator); + static ReceivedMessage _mapReceivedMessage(grpc.ReceivedMessage m) => + ReceivedMessage( + ackId: m.ackId, + message: Message( + data: m.message.data, + attributes: m.message.attributes, + messageId: m.message.messageId, + publishTime: m.message.publishTime.toDateTime(), + ), + ); + /// Constructs a client used to communicate with [Google Cloud Pub/Sub][]. factory PubSub({String? projectId, String? apiEndpoint}) { final emulatorHost = pubsubEmulatorHost; @@ -103,9 +109,30 @@ final class PubSub { if (_isEmulator) { return CallOptions(); } - _authClient ??= await auth.clientViaApplicationDefaultCredentials( - scopes: ['https://www.googleapis.com/auth/pubsub'], - ); + if (_authClient == null) { + _authClientFuture ??= auth.clientViaApplicationDefaultCredentials( + scopes: ['https://www.googleapis.com/auth/pubsub'], + ); + _authClient = await _authClientFuture; + } + + // AutoRefreshingAuthClient only refreshes when used via HTTP. But we + // extract the access token manually for using in grpc calls. + // We trigger a refresh by making a dummy request if close to expiry. + final expiry = _authClient!.credentials.accessToken.expiry; + if (expiry.isBefore(DateTime.now().add(const Duration(minutes: 5)))) { + try { + await _authClient!.get( + Uri.parse( + 'https://pubsub.googleapis.com/v1/projects/non-existent-project/topics', + ), + ); + } on Exception catch (_) { + // Ignore exceptions, we just want the side effect of refreshing the + // token. + } + } + final token = _authClient!.credentials.accessToken.data; return CallOptions(metadata: {'authorization': 'Bearer $token'}); } @@ -118,6 +145,7 @@ final class PubSub { /// Closes the client and cleans up any resources associated with it. Future close() async { await _channel.shutdown(); + _authClient?.close(); } // Topic-related methods @@ -303,19 +331,7 @@ final class PubSub { options: await _callOptions, ); - return response.receivedMessages - .map( - (m) => ReceivedMessage( - ackId: m.ackId, - message: Message( - data: m.message.data, - attributes: m.message.attributes, - messageId: m.message.messageId, - publishTime: m.message.publishTime.toDateTime(), - ), - ), - ) - .toList(); + return response.receivedMessages.map(_mapReceivedMessage).toList(); } on GrpcError catch (e) { if (e.code == StatusCode.notFound) { throw SubscriptionNotFoundException(subscriptionName); @@ -362,15 +378,7 @@ final class PubSub { try { await for (final response in responseStream) { for (final m in response.receivedMessages) { - yield ReceivedMessage( - ackId: m.ackId, - message: Message( - data: m.message.data, - attributes: m.message.attributes, - messageId: m.message.messageId, - publishTime: m.message.publishTime.toDateTime(), - ), - ); + yield _mapReceivedMessage(m); } } } on GrpcError catch (e) { diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart index ed0d4bdd..87014be0 100644 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -219,7 +219,7 @@ void main() { // Start streaming pull final stream = client!.streamingPull(subscriptionName); - // Use stream.first to get the first message and automatically cancel the + // Use stream.first to get the first message and automatically cancel the // stream. final receivedMessage = await stream.first; @@ -229,33 +229,30 @@ void main() { await client!.acknowledge(subscriptionName, [receivedMessage.ackId]); }); - test( - 'streaming pull throws StreamBrokenException ' - 'when subscription is deleted', - () async { - if (client == null) return; // Skipped + test('streaming pull throws StreamBrokenException ' + 'when subscription is deleted', () async { + if (client == null) return; // Skipped - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = - 'test-sub-' - '${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - final subscription = client!.subscription(subscriptionName); + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-' + '${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); - await topic.create(); - addTearDown(() async => await topic.delete()); + await topic.create(); + addTearDown(() async => await topic.delete()); - await subscription.create(topic: topicName); + await subscription.create(topic: topicName); - // Start streaming pull - final stream = client!.streamingPull(subscriptionName); + // Start streaming pull + final stream = client!.streamingPull(subscriptionName); - // Delete subscription to break the stream - await subscription.delete(); + // Delete subscription to break the stream + await subscription.delete(); - // Expect stream to throw StreamBrokenException - expect(stream.first, throwsA(isA())); - }, - ); + // Expect stream to throw StreamBrokenException + expect(stream.first, throwsA(isA())); + }); }); } From 89030f6c8d0cee286e893d9cea4f899da3da8367 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Tue, 12 May 2026 09:49:57 +0000 Subject: [PATCH 07/18] PubSub: Remove web support, add common exception, improve tests, and add license/changelog --- pkgs/google_cloud_pubsub/CHANGELOG.md | 5 + pkgs/google_cloud_pubsub/LICENSE | 202 ++++++++++++++++++ pkgs/google_cloud_pubsub/README.md | 73 +++++++ pkgs/google_cloud_pubsub/lib/src/client.dart | 57 +++-- .../lib/src/exceptions.dart | 13 +- .../lib/src/pubsub_emulator_host_web.dart | 27 --- .../test/integration_test.dart | 98 ++++++--- 7 files changed, 381 insertions(+), 94 deletions(-) create mode 100644 pkgs/google_cloud_pubsub/CHANGELOG.md create mode 100644 pkgs/google_cloud_pubsub/LICENSE create mode 100644 pkgs/google_cloud_pubsub/README.md delete mode 100644 pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_web.dart diff --git a/pkgs/google_cloud_pubsub/CHANGELOG.md b/pkgs/google_cloud_pubsub/CHANGELOG.md new file mode 100644 index 00000000..df84b847 --- /dev/null +++ b/pkgs/google_cloud_pubsub/CHANGELOG.md @@ -0,0 +1,5 @@ +## 0.1.0 + +- Initial release of the experimental Google Cloud Pub/Sub client. +- Supports basic topic and subscription management. +- Supports publishing and pulling messages (including streaming pull). diff --git a/pkgs/google_cloud_pubsub/LICENSE b/pkgs/google_cloud_pubsub/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/pkgs/google_cloud_pubsub/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkgs/google_cloud_pubsub/README.md b/pkgs/google_cloud_pubsub/README.md new file mode 100644 index 00000000..0271a38c --- /dev/null +++ b/pkgs/google_cloud_pubsub/README.md @@ -0,0 +1,73 @@ +[![pub package](https://img.shields.io/pub/v/google_cloud_pubsub.svg)](https://pub.dev/packages/google_cloud_pubsub) +[![package publisher](https://img.shields.io/pub/publisher/google_cloud_pubsub.svg)](https://pub.dev/packages/google_cloud_pubsub/publisher) + +A Dart client for Google Cloud Pub/Sub. + +> [!NOTE] +> This package is currently experimental and published under the +> [labs.dart.dev](https://dart.dev/dart-team-packages) pub publisher in order +> to solicit feedback. +> +> For packages in the labs.dart.dev publisher we generally plan to either +> graduate the package into a supported publisher (dart.dev, tools.dart.dev) +> after a period of feedback and iteration, or discontinue the package. +> These packages have a much higher expected rate of API and breaking changes. +> +> Your feedback is valuable and will help us evolve this package. For general +> feedback, suggestions, and comments, please file an issue in the +> [bug tracker](https://github.com/googleapis/google-cloud-dart/issues). + +## Using Google Cloud PubSub + +All access to Google Cloud Pub/Sub is made through the `PubSub` class. + +```dart +import 'dart:convert'; +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; + +void main() async { + // By default, the `PubSub` class will use the currently configured project + // and automatically attempt to authenticate using Application Default + // Credentials. + final pubSub = PubSub(); + + // Create a topic. + final topic = await pubSub.createTopic('put-your-topic-name-here'); + + // Create a subscription to that topic. + final subscription = await pubSub.createSubscription( + 'put-your-subscription-name-here', + topic: topic.name, + ); + + // Publish a message. + await pubSub.publish(topic.name, utf8.encode('message 1')); + + // Pull messages from the subscription. + final messages = await subscription.pull(maxMessages: 1); + + for (final receivedMessage in messages) { + print('Received message: ${utf8.decode(receivedMessage.message.data)}'); + + // Acknowledge the message.` + await subscription.acknowledge([receivedMessage.ackId]); + } + + print( + 'Your topic is available at:\n' + 'https://pubsub.googleapis.com/v1/projects//topics/${topic.name}', + ); + + // Clean up. + await subscription.delete(); + await topic.delete(); + + pubSub.close(); +} +``` + +> [!NOTE] +> You must [set up authentication][] before using this package outside of +> Google Cloud. + +[set up authentication]: https://docs.cloud.google.com/pubsub/docs/reference/libraries#authentication diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index 3f78e3c3..53e642df 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -14,12 +14,10 @@ import 'dart:async'; -import 'package:googleapis_auth/auth_io.dart' as auth; import 'package:grpc/grpc.dart'; import '../google_cloud_pubsub.dart'; import 'generated/google/pubsub/v1/pubsub.pbgrpc.dart' as grpc; -import 'pubsub_emulator_host_web.dart' - if (dart.library.io) 'pubsub_emulator_host_vm.dart'; +import 'pubsub_emulator_host_vm.dart'; import 'subscription.dart' show newSubscription; import 'topic.dart' show newTopic; @@ -32,8 +30,7 @@ final class PubSub { final bool _isEmulator; grpc.PublisherClient? _publisherClient; grpc.SubscriberClient? _subscriberClient; - auth.AutoRefreshingAuthClient? _authClient; - Future? _authClientFuture; + Future Function()? _tokenProvider; Future get _requiredProjectId async { final id = await _projectId; @@ -82,7 +79,12 @@ final class PubSub { ); } - PubSub._(this._projectId, this._channel, this._isEmulator); + PubSub._( + this._projectId, + this._channel, + this._isEmulator, + this._tokenProvider, + ); static ReceivedMessage _mapReceivedMessage(grpc.ReceivedMessage m) => ReceivedMessage( @@ -96,12 +98,24 @@ final class PubSub { ); /// Constructs a client used to communicate with [Google Cloud Pub/Sub][]. - factory PubSub({String? projectId, String? apiEndpoint}) { + /// + /// For authentication, a [tokenProvider] can be supplied to obtain + /// and refresh access tokens for authenticating gRPC requests. The provider + /// must return the raw access token (e.g., "ya29.a0AfB_g..."), which will be + /// prefixed with "Bearer" in the authorization header. + /// + /// It will be invoked once per request. + factory PubSub({ + String? projectId, + String? apiEndpoint, + Future Function()? tokenProvider, + }) { final emulatorHost = pubsubEmulatorHost; return PubSub._( _calculateProjectId(projectId, emulatorHost), _calculateChannel(apiEndpoint, emulatorHost), emulatorHost != null, + tokenProvider, ); } @@ -109,31 +123,11 @@ final class PubSub { if (_isEmulator) { return CallOptions(); } - if (_authClient == null) { - _authClientFuture ??= auth.clientViaApplicationDefaultCredentials( - scopes: ['https://www.googleapis.com/auth/pubsub'], - ); - _authClient = await _authClientFuture; - } - - // AutoRefreshingAuthClient only refreshes when used via HTTP. But we - // extract the access token manually for using in grpc calls. - // We trigger a refresh by making a dummy request if close to expiry. - final expiry = _authClient!.credentials.accessToken.expiry; - if (expiry.isBefore(DateTime.now().add(const Duration(minutes: 5)))) { - try { - await _authClient!.get( - Uri.parse( - 'https://pubsub.googleapis.com/v1/projects/non-existent-project/topics', - ), - ); - } on Exception catch (_) { - // Ignore exceptions, we just want the side effect of refreshing the - // token. - } + final provider = _tokenProvider; + if (provider == null) { + return CallOptions(); } - - final token = _authClient!.credentials.accessToken.data; + final token = await provider(); return CallOptions(metadata: {'authorization': 'Bearer $token'}); } @@ -145,7 +139,6 @@ final class PubSub { /// Closes the client and cleans up any resources associated with it. Future close() async { await _channel.shutdown(); - _authClient?.close(); } // Topic-related methods diff --git a/pkgs/google_cloud_pubsub/lib/src/exceptions.dart b/pkgs/google_cloud_pubsub/lib/src/exceptions.dart index 491619b7..a635ece6 100644 --- a/pkgs/google_cloud_pubsub/lib/src/exceptions.dart +++ b/pkgs/google_cloud_pubsub/lib/src/exceptions.dart @@ -14,8 +14,11 @@ import 'package:grpc/grpc.dart'; +/// Base class for all exceptions thrown by the google_cloud_pubsub package. +abstract class PubSubException implements Exception {} + /// Thrown when a topic is not found. -class TopicNotFoundException implements Exception { +class TopicNotFoundException implements PubSubException { /// The name of the topic that was not found. final String name; @@ -26,7 +29,7 @@ class TopicNotFoundException implements Exception { } /// Thrown when a topic already exists. -class TopicAlreadyExistsException implements Exception { +class TopicAlreadyExistsException implements PubSubException { /// The name of the topic that already exists. final String name; @@ -38,7 +41,7 @@ class TopicAlreadyExistsException implements Exception { } /// Thrown when a subscription already exists. -class SubscriptionAlreadyExistsException implements Exception { +class SubscriptionAlreadyExistsException implements PubSubException { /// The name of the subscription that already exists. final String name; @@ -51,7 +54,7 @@ class SubscriptionAlreadyExistsException implements Exception { } /// Thrown when a subscription is not found. -class SubscriptionNotFoundException implements Exception { +class SubscriptionNotFoundException implements PubSubException { /// The name of the subscription that was not found. final String name; @@ -63,7 +66,7 @@ class SubscriptionNotFoundException implements Exception { } /// Thrown when a streaming pull connection is broken. -class StreamBrokenException implements Exception { +class StreamBrokenException implements PubSubException { /// The underlying gRPC error that caused the stream to break. final GrpcError error; diff --git a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_web.dart b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_web.dart deleted file mode 100644 index 3cc74179..00000000 --- a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_web.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2026 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import 'package:meta/meta.dart'; - -/// The host and port of the Google Cloud Pub/Sub emulator, if set. -/// -/// Will never be set on the web. -@internal -String? get pubsubEmulatorHost => null; - -/// The project ID inferred from the environment. -/// -/// Will never be set on the web. -@internal -String? get projectFromEnvironment => null; diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart index 87014be0..d7f09639 100644 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -1,12 +1,11 @@ -@Tags(['google-cloud']) -library; - import 'dart:convert'; import 'dart:io'; import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; import 'package:test/test.dart'; +import 'src/credentials.dart'; + void main() { group('PubSub Integration', () { PubSub? client; @@ -18,13 +17,17 @@ void main() { if (host != null) { client = PubSub(projectId: 'test-project'); } else if (project != null) { - client = PubSub(projectId: project); + client = PubSub( + projectId: project, + tokenProvider: applicationDefaultCredentials( + scopes: ['https://www.googleapis.com/auth/pubsub'], + ), + ); } else { - markTestSkipped( + fail( 'Neither PUBSUB_EMULATOR_HOST nor GOOGLE_CLOUD_PROJECT ' 'environment variable set', ); - return; } }); @@ -33,8 +36,6 @@ void main() { }); test('create topic and publish message', () async { - if (client == null) return; // Skipped - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; final topic = client!.topic(topicName); @@ -51,8 +52,6 @@ void main() { }); test('Delete non-existent topic returns false', () async { - if (client == null) return; // Skipped - final topic = client!.topic( 'non-existent-${DateTime.now().millisecondsSinceEpoch}', ); @@ -61,8 +60,6 @@ void main() { }); test('create existing topic throws TopicAlreadyExistsException', () async { - if (client == null) return; // Skipped - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; final topic = client!.topic(topicName); @@ -77,8 +74,6 @@ void main() { test( 'create existing subscription throws SubscriptionAlreadyExistsException', () async { - if (client == null) return; // Skipped - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; final subscriptionName = 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; @@ -102,8 +97,6 @@ void main() { test('create subscription for non-existent topic throws ' 'TopicNotFoundException', () async { - if (client == null) return; // Skipped - final subscriptionName = 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; final subscription = client!.subscription(subscriptionName); @@ -117,8 +110,6 @@ void main() { test( 'publish to non-existent topic throws TopicNotFoundException', () async { - if (client == null) return; // Skipped - final topicName = 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; final topic = client!.topic(topicName); @@ -132,8 +123,6 @@ void main() { test('pull from non-existent subscription throws ' 'SubscriptionNotFoundException', () async { - if (client == null) return; // Skipped - final subscriptionName = 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; final subscription = client!.subscription(subscriptionName); @@ -143,8 +132,6 @@ void main() { test('acknowledge for non-existent subscription throws ' 'SubscriptionNotFoundException', () async { - if (client == null) return; // Skipped - final subscriptionName = 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; final subscription = client!.subscription(subscriptionName); @@ -157,8 +144,6 @@ void main() { test('modifyAckDeadline for non-existent subscription throws ' 'SubscriptionNotFoundException', () async { - if (client == null) return; // Skipped - final subscriptionName = 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; final subscription = client!.subscription(subscriptionName); @@ -170,8 +155,6 @@ void main() { }); test('publish and pull message', () async { - if (client == null) return; // Skipped - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; final subscriptionName = 'test-sub-' @@ -198,8 +181,6 @@ void main() { }); test('publish and streaming pull message', () async { - if (client == null) return; // Skipped - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; final subscriptionName = 'test-sub-' @@ -231,8 +212,6 @@ void main() { test('streaming pull throws StreamBrokenException ' 'when subscription is deleted', () async { - if (client == null) return; // Skipped - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; final subscriptionName = 'test-sub-' @@ -254,5 +233,64 @@ void main() { // Expect stream to throw StreamBrokenException expect(stream.first, throwsA(isA())); }); + + test('publish and pull message with attributes', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topicName); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello PubSub with Attributes'); + final attributes = {'key1': 'value1', 'key2': 'value2'}; + await topic.publish(data, attributes: attributes); + + // Pull message + final messages = await client!.pull(subscriptionName); + expect(messages, hasLength(1)); + expect(messages.first.message.data, equals(data)); + expect(messages.first.message.attributes, equals(attributes)); + + // Ack message + await client!.acknowledge(subscriptionName, [messages.first.ackId]); + }); + + test('publish multiple messages and pull batch', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topicName); + addTearDown(() async => await subscription.delete()); + + final data1 = utf8.encode('Message 1'); + final data2 = utf8.encode('Message 2'); + await topic.publish(data1); + await topic.publish(data2); + + // Pull messages + final messages = await client!.pull(subscriptionName, maxMessages: 2); + expect(messages, hasLength(2)); + + final receivedData = messages.map((m) => m.message.data).toList(); + expect(receivedData, containsAll([data1, data2])); + + // Ack messages + await client!.acknowledge( + subscriptionName, + messages.map((m) => m.ackId).toList(), + ); + }); }); } From f5cb39d7e4e1d92fbab0dc122cc2050c310c82e1 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Tue, 12 May 2026 09:50:40 +0000 Subject: [PATCH 08/18] PubSub: Commit forgotten files (example and credentials helper) and stage test deletion --- .../example/credentials_example.dart | 167 ++++++++++++++++++ .../google_cloud_pubsub/test/client_test.dart | 28 --- .../test/src/credentials.dart | 143 +++++++++++++++ 3 files changed, 310 insertions(+), 28 deletions(-) create mode 100644 pkgs/google_cloud_pubsub/example/credentials_example.dart delete mode 100644 pkgs/google_cloud_pubsub/test/client_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/src/credentials.dart diff --git a/pkgs/google_cloud_pubsub/example/credentials_example.dart b/pkgs/google_cloud_pubsub/example/credentials_example.dart new file mode 100644 index 00000000..167f8384 --- /dev/null +++ b/pkgs/google_cloud_pubsub/example/credentials_example.dart @@ -0,0 +1,167 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:googleapis_auth/auth_io.dart' as auth; +import 'package:http/http.dart' as http; + +Future main() async { + // Initialize the token provider function with the required scopes. + final tokenProvider = applicationDefaultCredentials( + scopes: ['https://www.googleapis.com/auth/pubsub'], + ); + + // Pass the token provider to the PubSub client constructor. + final pubsub = PubSub( + projectId: 'my-project-id', + tokenProvider: tokenProvider, + ); + + try { + // The client will use the token provider to make authenticated requests. + final topic = pubsub.topic('my-topic'); + print('Successfully initialized client for topic: ${topic.name}'); + } on CredentialsException catch (e) { + print('Failed to obtain credentials: ${e.message}'); + } finally { + await pubsub.close(); + } +} + +/// Exception thrown when security credentials cannot be obtained or +/// refreshed. +final class CredentialsException implements Exception { + /// A message describing the credential failure. + final String message; + + /// The underlying exception or error that caused this failure, if any. + final Object? innerException; + + /// Creates a [CredentialsException] with the specified [message] and optional + /// [innerException]. + CredentialsException(this.message, [this.innerException]); + + @override + String toString() { + final cause = innerException != null ? ' (caused by: $innerException)' : ''; + return 'CredentialsException: $message$cause'; + } +} + +/// Resolves and returns a function that returns a valid access token, +/// refreshing it if it has expired or is about to expire within 5 minutes. +/// +/// * [scopes] must not be empty. +Future Function() applicationDefaultCredentials({ + required List scopes, + http.Client? httpClient, +}) { + if (scopes.isEmpty) { + throw ArgumentError.value(scopes, 'scopes', 'Must not be empty.'); + } + + final client = httpClient ?? http.Client(); + auth.AccessCredentials? credentials; + + Future obtainFromFile(File file) async { + final jsonContent = await file.readAsString(); + final credentialsMap = json.decode(jsonContent) as Map; + + final type = credentialsMap['type'] as String?; + if (type == 'authorized_user') { + final clientIdString = credentialsMap['client_id'] as String; + final clientSecret = credentialsMap['client_secret'] as String?; + final refreshToken = credentialsMap['refresh_token'] as String?; + final clientId = auth.ClientId(clientIdString, clientSecret); + + return await auth.refreshCredentials( + clientId, + auth.AccessCredentials( + auth.AccessToken('Bearer', '', DateTime(0).toUtc()), + refreshToken, + scopes, + ), + client, + ); + } + + if (type == 'service_account') { + final sac = auth.ServiceAccountCredentials.fromJson(credentialsMap); + return await auth.obtainAccessCredentialsViaServiceAccount( + sac, + scopes, + client, + ); + } + + throw CredentialsException('Unsupported credential type: $type'); + } + + Future obtainCredentials() async { + final credsEnv = Platform.environment['GOOGLE_APPLICATION_CREDENTIALS']; + if (credsEnv != null && credsEnv.isNotEmpty) { + return await obtainFromFile(File(credsEnv)); + } + + File credFile; + if (Platform.isWindows) { + final appData = Platform.environment['APPDATA']; + if (appData == null) { + throw StateError( + 'The expected environment variable APPDATA must be set.', + ); + } + credFile = File.fromUri( + Uri.directory( + appData, + ).resolve('gcloud/application_default_credentials.json'), + ); + } else { + final homeVar = Platform.environment['HOME']; + if (homeVar == null) { + throw StateError('The expected environment variable HOME must be set.'); + } + credFile = File.fromUri( + Uri.directory( + homeVar, + ).resolve('.config/gcloud/application_default_credentials.json'), + ); + } + + if (await credFile.exists()) { + return await obtainFromFile(credFile); + } + + return await auth.obtainAccessCredentialsViaMetadataServer(client); + } + + return () async { + try { + var creds = credentials ??= await obtainCredentials(); + + final threshold = DateTime.now().toUtc().add(const Duration(minutes: 5)); + if (creds.accessToken.expiry.isBefore(threshold)) { + creds = credentials = await obtainCredentials(); + } + + return creds.accessToken.data; + } on Exception catch (e) { + throw CredentialsException('Failed to obtain or refresh access token', e); + } + }; +} diff --git a/pkgs/google_cloud_pubsub/test/client_test.dart b/pkgs/google_cloud_pubsub/test/client_test.dart deleted file mode 100644 index ad99d12e..00000000 --- a/pkgs/google_cloud_pubsub/test/client_test.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; -import 'package:test/test.dart'; - -void main() { - group('PubSub', () { - test('constructs with project ID', () async { - final client = PubSub(projectId: 'my-project'); - addTearDown(client.close); - expect(client, isNotNull); - }); - - test('topic returns a Topic instance', () { - final client = PubSub(projectId: 'my-project'); - addTearDown(client.close); - final topic = client.topic('my-topic'); - expect(topic, isNotNull); - expect(topic.name, 'my-topic'); - }); - - test('subscription returns a Subscription instance', () { - final client = PubSub(projectId: 'my-project'); - addTearDown(client.close); - final subscription = client.subscription('my-subscription'); - expect(subscription, isNotNull); - expect(subscription.name, 'my-subscription'); - }); - }); -} diff --git a/pkgs/google_cloud_pubsub/test/src/credentials.dart b/pkgs/google_cloud_pubsub/test/src/credentials.dart new file mode 100644 index 00000000..c27f07db --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/src/credentials.dart @@ -0,0 +1,143 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:googleapis_auth/auth_io.dart' as auth; +import 'package:http/http.dart' as http; + +/// Exception thrown when security credentials cannot be obtained or +/// refreshed. +final class CredentialsException implements Exception { + /// A message describing the credential failure. + final String message; + + /// The underlying exception or error that caused this failure, if any. + final Object? innerException; + + /// Creates a [CredentialsException] with the specified [message] and optional + /// [innerException]. + CredentialsException(this.message, [this.innerException]); + + @override + String toString() { + final cause = innerException != null ? ' (caused by: $innerException)' : ''; + return 'CredentialsException: $message$cause'; + } +} + +/// Resolves and returns a function that returns a valid access token, +/// refreshing it if it has expired or is about to expire within 5 minutes. +/// +/// * [scopes] must not be empty. +Future Function() applicationDefaultCredentials({ + required List scopes, + http.Client? httpClient, +}) { + if (scopes.isEmpty) { + throw ArgumentError.value(scopes, 'scopes', 'Must not be empty.'); + } + + final client = httpClient ?? http.Client(); + auth.AccessCredentials? credentials; + + Future obtainFromFile(File file) async { + final jsonContent = await file.readAsString(); + final credentialsMap = json.decode(jsonContent) as Map; + + final type = credentialsMap['type'] as String?; + if (type == 'authorized_user') { + final clientIdString = credentialsMap['client_id'] as String; + final clientSecret = credentialsMap['client_secret'] as String?; + final refreshToken = credentialsMap['refresh_token'] as String?; + final clientId = auth.ClientId(clientIdString, clientSecret); + + return await auth.refreshCredentials( + clientId, + auth.AccessCredentials( + auth.AccessToken('Bearer', '', DateTime(0).toUtc()), + refreshToken, + scopes, + ), + client, + ); + } + + if (type == 'service_account') { + final sac = auth.ServiceAccountCredentials.fromJson(credentialsMap); + return await auth.obtainAccessCredentialsViaServiceAccount( + sac, + scopes, + client, + ); + } + + throw CredentialsException('Unsupported credential type: $type'); + } + + Future obtainCredentials() async { + final credsEnv = Platform.environment['GOOGLE_APPLICATION_CREDENTIALS']; + if (credsEnv != null && credsEnv.isNotEmpty) { + return await obtainFromFile(File(credsEnv)); + } + + File credFile; + if (Platform.isWindows) { + final appData = Platform.environment['APPDATA']; + if (appData == null) { + throw StateError( + 'The expected environment variable APPDATA must be set.', + ); + } + credFile = File.fromUri( + Uri.directory( + appData, + ).resolve('gcloud/application_default_credentials.json'), + ); + } else { + final homeVar = Platform.environment['HOME']; + if (homeVar == null) { + throw StateError('The expected environment variable HOME must be set.'); + } + credFile = File.fromUri( + Uri.directory( + homeVar, + ).resolve('.config/gcloud/application_default_credentials.json'), + ); + } + + if (await credFile.exists()) { + return await obtainFromFile(credFile); + } + + return await auth.obtainAccessCredentialsViaMetadataServer(client); + } + + return () async { + try { + var creds = credentials ??= await obtainCredentials(); + + final threshold = DateTime.now().toUtc().add(const Duration(minutes: 5)); + if (creds.accessToken.expiry.isBefore(threshold)) { + creds = credentials = await obtainCredentials(); + } + + return creds.accessToken.data; + } on Exception catch (e) { + throw CredentialsException('Failed to obtain or refresh access token', e); + } + }; +} From 5640799dd827e7b49f220d60f33231d75b3c094d Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Thu, 21 May 2026 14:39:16 +0000 Subject: [PATCH 09/18] Fix credentials helper race condition, HTTP client leak, and flaky pull integration tests --- pkgs/google_cloud_pubsub/README.md | 8 +- .../example/credentials_example.dart | 86 +++++++++++-------- pkgs/google_cloud_pubsub/lib/src/client.dart | 66 ++++++++++---- .../lib/src/exceptions.dart | 28 ++++-- .../test/integration_test.dart | 24 +++++- .../test/src/credentials.dart | 86 +++++++++++-------- 6 files changed, 202 insertions(+), 96 deletions(-) diff --git a/pkgs/google_cloud_pubsub/README.md b/pkgs/google_cloud_pubsub/README.md index 0271a38c..05e64882 100644 --- a/pkgs/google_cloud_pubsub/README.md +++ b/pkgs/google_cloud_pubsub/README.md @@ -26,10 +26,10 @@ import 'dart:convert'; import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; void main() async { - // By default, the `PubSub` class will use the currently configured project - // and automatically attempt to authenticate using Application Default - // Credentials. - final pubSub = PubSub(); + // Note: You must provide a `tokenProvider` for authentication. + final pubSub = PubSub( + tokenProvider: () async => 'your-access-token', + ); // Create a topic. final topic = await pubSub.createTopic('put-your-topic-name-here'); diff --git a/pkgs/google_cloud_pubsub/example/credentials_example.dart b/pkgs/google_cloud_pubsub/example/credentials_example.dart index 167f8384..3ad08d97 100644 --- a/pkgs/google_cloud_pubsub/example/credentials_example.dart +++ b/pkgs/google_cloud_pubsub/example/credentials_example.dart @@ -66,7 +66,11 @@ final class CredentialsException implements Exception { /// Resolves and returns a function that returns a valid access token, /// refreshing it if it has expired or is about to expire within 5 minutes. /// +/// Preconditions: /// * [scopes] must not be empty. +/// +/// Throws a [CredentialsException] if security credentials cannot be +/// obtained or refreshed. Future Function() applicationDefaultCredentials({ required List scopes, http.Client? httpClient, @@ -75,10 +79,12 @@ Future Function() applicationDefaultCredentials({ throw ArgumentError.value(scopes, 'scopes', 'Must not be empty.'); } - final client = httpClient ?? http.Client(); - auth.AccessCredentials? credentials; + Future? credentialsFuture; - Future obtainFromFile(File file) async { + Future obtainFromFile( + File file, + http.Client client, + ) async { final jsonContent = await file.readAsString(); final credentialsMap = json.decode(jsonContent) as Map; @@ -113,54 +119,66 @@ Future Function() applicationDefaultCredentials({ } Future obtainCredentials() async { - final credsEnv = Platform.environment['GOOGLE_APPLICATION_CREDENTIALS']; - if (credsEnv != null && credsEnv.isNotEmpty) { - return await obtainFromFile(File(credsEnv)); - } + final client = httpClient ?? http.Client(); + try { + final credsEnv = Platform.environment['GOOGLE_APPLICATION_CREDENTIALS']; + if (credsEnv != null && credsEnv.isNotEmpty) { + return await obtainFromFile(File(credsEnv), client); + } - File credFile; - if (Platform.isWindows) { - final appData = Platform.environment['APPDATA']; - if (appData == null) { - throw StateError( - 'The expected environment variable APPDATA must be set.', + File credFile; + if (Platform.isWindows) { + final appData = Platform.environment['APPDATA']; + if (appData == null) { + throw StateError( + 'The expected environment variable APPDATA must be set.', + ); + } + credFile = File.fromUri( + Uri.directory( + appData, + ).resolve('gcloud/application_default_credentials.json'), + ); + } else { + final homeVar = Platform.environment['HOME']; + if (homeVar == null) { + throw StateError( + 'The expected environment variable HOME must be set.', + ); + } + credFile = File.fromUri( + Uri.directory( + homeVar, + ).resolve('.config/gcloud/application_default_credentials.json'), ); } - credFile = File.fromUri( - Uri.directory( - appData, - ).resolve('gcloud/application_default_credentials.json'), - ); - } else { - final homeVar = Platform.environment['HOME']; - if (homeVar == null) { - throw StateError('The expected environment variable HOME must be set.'); + + if (await credFile.exists()) { + return await obtainFromFile(credFile, client); } - credFile = File.fromUri( - Uri.directory( - homeVar, - ).resolve('.config/gcloud/application_default_credentials.json'), - ); - } - if (await credFile.exists()) { - return await obtainFromFile(credFile); + return await auth.obtainAccessCredentialsViaMetadataServer(client); + } finally { + if (httpClient == null) { + client.close(); + } } - - return await auth.obtainAccessCredentialsViaMetadataServer(client); } return () async { try { - var creds = credentials ??= await obtainCredentials(); + var future = credentialsFuture ??= obtainCredentials(); + var creds = await future; final threshold = DateTime.now().toUtc().add(const Duration(minutes: 5)); if (creds.accessToken.expiry.isBefore(threshold)) { - creds = credentials = await obtainCredentials(); + future = credentialsFuture = obtainCredentials(); + creds = await future; } return creds.accessToken.data; } on Exception catch (e) { + credentialsFuture = null; throw CredentialsException('Failed to obtain or refresh access token', e); } }; diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index 53e642df..05df9c39 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -25,7 +25,7 @@ import 'topic.dart' show newTopic; /// /// See [Google Cloud Pub/Sub](https://cloud.google.com/pubsub). final class PubSub { - final FutureOr _projectId; + final FutureOr _projectId; final ClientChannel _channel; final bool _isEmulator; grpc.PublisherClient? _publisherClient; @@ -34,21 +34,19 @@ final class PubSub { Future get _requiredProjectId async { final id = await _projectId; - if (id == noProject) { + if (id == null) { throw StateError('a project ID is required'); } return id; } - static const String noProject = ''; - - static FutureOr _calculateProjectId( + static FutureOr _calculateProjectId( String? projectId, String? emulatorHost, ) => switch ((projectId, emulatorHost)) { (final String projectId, _) => projectId, (null, _?) => projectFromEnvironment ?? 'test-project', - (null, null) => projectFromEnvironment ?? 'unknown-project', + (null, null) => projectFromEnvironment, }; static ClientChannel _calculateChannel( @@ -86,6 +84,8 @@ final class PubSub { this._tokenProvider, ); + /// Turns the protobuf-generated [grpc.ReceivedMessage] into a + /// [ReceivedMessage]. static ReceivedMessage _mapReceivedMessage(grpc.ReceivedMessage m) => ReceivedMessage( ackId: m.ackId, @@ -165,7 +165,11 @@ final class PubSub { if (e.code == StatusCode.alreadyExists) { throw TopicAlreadyExistsException(name); } - rethrow; + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } } @@ -186,7 +190,11 @@ final class PubSub { if (e.code == StatusCode.notFound) { return false; } - rethrow; + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } } @@ -222,7 +230,11 @@ final class PubSub { if (e.code == StatusCode.notFound) { throw TopicNotFoundException(topicName); } - rethrow; + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } } @@ -269,7 +281,11 @@ final class PubSub { if (e.code == StatusCode.notFound) { throw TopicNotFoundException(topic); } - rethrow; + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } } @@ -296,7 +312,11 @@ final class PubSub { if (e.code == StatusCode.notFound) { return false; } - rethrow; + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } } @@ -329,7 +349,11 @@ final class PubSub { if (e.code == StatusCode.notFound) { throw SubscriptionNotFoundException(subscriptionName); } - rethrow; + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } } @@ -375,7 +399,11 @@ final class PubSub { } } } on GrpcError catch (e) { - throw StreamBrokenException(e); + throw StreamBrokenException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } finally { await requestController.close(); } @@ -408,7 +436,11 @@ final class PubSub { if (e.code == StatusCode.notFound) { throw SubscriptionNotFoundException(subscriptionName); } - rethrow; + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } } @@ -443,7 +475,11 @@ final class PubSub { if (e.code == StatusCode.notFound) { throw SubscriptionNotFoundException(subscriptionName); } - rethrow; + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); } } diff --git a/pkgs/google_cloud_pubsub/lib/src/exceptions.dart b/pkgs/google_cloud_pubsub/lib/src/exceptions.dart index a635ece6..52fa8f5d 100644 --- a/pkgs/google_cloud_pubsub/lib/src/exceptions.dart +++ b/pkgs/google_cloud_pubsub/lib/src/exceptions.dart @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -import 'package:grpc/grpc.dart'; - /// Base class for all exceptions thrown by the google_cloud_pubsub package. abstract class PubSubException implements Exception {} @@ -67,11 +65,29 @@ class SubscriptionNotFoundException implements PubSubException { /// Thrown when a streaming pull connection is broken. class StreamBrokenException implements PubSubException { - /// The underlying gRPC error that caused the stream to break. - final GrpcError error; + final int code; + final String message; + final Map trailers; + + StreamBrokenException(this.code, this.message, [this.trailers = const {}]); + + @override + String toString() => 'StreamBrokenException: [$code] $message'; +} + +/// Thrown when a Pub/Sub operation fails due to a gRPC error. +class PubSubOperationException implements PubSubException { + /// The gRPC status code. + final int code; + + /// The error message. + final String message; + + /// The trailers from the gRPC error. + final Map trailers; - StreamBrokenException(this.error); + PubSubOperationException(this.code, this.message, [this.trailers = const {}]); @override - String toString() => 'StreamBrokenException: ${error.message}'; + String toString() => 'PubSubOperationException: [$code] $message'; } diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart index d7f09639..e8ca408f 100644 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -10,6 +10,24 @@ void main() { group('PubSub Integration', () { PubSub? client; + Future> pullReliably( + String subscriptionName, { + required int count, + }) async { + final messages = []; + for (var i = 0; i < 10 && messages.length < count; i++) { + if (i > 0) { + await Future.delayed(const Duration(seconds: 1)); + } + final pulled = await client!.pull( + subscriptionName, + maxMessages: count - messages.length, + ); + messages.addAll(pulled); + } + return messages; + } + setUp(() async { final host = Platform.environment['PUBSUB_EMULATOR_HOST']; final project = Platform.environment['GOOGLE_CLOUD_PROJECT']; @@ -172,7 +190,7 @@ void main() { await topic.publish(data); // Pull message - final messages = await client!.pull(subscriptionName); + final messages = await pullReliably(subscriptionName, count: 1); expect(messages, hasLength(1)); expect(messages.first.message.data, equals(data)); @@ -252,7 +270,7 @@ void main() { await topic.publish(data, attributes: attributes); // Pull message - final messages = await client!.pull(subscriptionName); + final messages = await pullReliably(subscriptionName, count: 1); expect(messages, hasLength(1)); expect(messages.first.message.data, equals(data)); expect(messages.first.message.attributes, equals(attributes)); @@ -280,7 +298,7 @@ void main() { await topic.publish(data2); // Pull messages - final messages = await client!.pull(subscriptionName, maxMessages: 2); + final messages = await pullReliably(subscriptionName, count: 2); expect(messages, hasLength(2)); final receivedData = messages.map((m) => m.message.data).toList(); diff --git a/pkgs/google_cloud_pubsub/test/src/credentials.dart b/pkgs/google_cloud_pubsub/test/src/credentials.dart index c27f07db..f801245e 100644 --- a/pkgs/google_cloud_pubsub/test/src/credentials.dart +++ b/pkgs/google_cloud_pubsub/test/src/credentials.dart @@ -42,7 +42,11 @@ final class CredentialsException implements Exception { /// Resolves and returns a function that returns a valid access token, /// refreshing it if it has expired or is about to expire within 5 minutes. /// +/// Preconditions: /// * [scopes] must not be empty. +/// +/// Throws a [CredentialsException] if security credentials cannot be +/// obtained or refreshed. Future Function() applicationDefaultCredentials({ required List scopes, http.Client? httpClient, @@ -51,10 +55,12 @@ Future Function() applicationDefaultCredentials({ throw ArgumentError.value(scopes, 'scopes', 'Must not be empty.'); } - final client = httpClient ?? http.Client(); - auth.AccessCredentials? credentials; + Future? credentialsFuture; - Future obtainFromFile(File file) async { + Future obtainFromFile( + File file, + http.Client client, + ) async { final jsonContent = await file.readAsString(); final credentialsMap = json.decode(jsonContent) as Map; @@ -89,54 +95,66 @@ Future Function() applicationDefaultCredentials({ } Future obtainCredentials() async { - final credsEnv = Platform.environment['GOOGLE_APPLICATION_CREDENTIALS']; - if (credsEnv != null && credsEnv.isNotEmpty) { - return await obtainFromFile(File(credsEnv)); - } + final client = httpClient ?? http.Client(); + try { + final credsEnv = Platform.environment['GOOGLE_APPLICATION_CREDENTIALS']; + if (credsEnv != null && credsEnv.isNotEmpty) { + return await obtainFromFile(File(credsEnv), client); + } - File credFile; - if (Platform.isWindows) { - final appData = Platform.environment['APPDATA']; - if (appData == null) { - throw StateError( - 'The expected environment variable APPDATA must be set.', + File credFile; + if (Platform.isWindows) { + final appData = Platform.environment['APPDATA']; + if (appData == null) { + throw StateError( + 'The expected environment variable APPDATA must be set.', + ); + } + credFile = File.fromUri( + Uri.directory( + appData, + ).resolve('gcloud/application_default_credentials.json'), + ); + } else { + final homeVar = Platform.environment['HOME']; + if (homeVar == null) { + throw StateError( + 'The expected environment variable HOME must be set.', + ); + } + credFile = File.fromUri( + Uri.directory( + homeVar, + ).resolve('.config/gcloud/application_default_credentials.json'), ); } - credFile = File.fromUri( - Uri.directory( - appData, - ).resolve('gcloud/application_default_credentials.json'), - ); - } else { - final homeVar = Platform.environment['HOME']; - if (homeVar == null) { - throw StateError('The expected environment variable HOME must be set.'); + + if (await credFile.exists()) { + return await obtainFromFile(credFile, client); } - credFile = File.fromUri( - Uri.directory( - homeVar, - ).resolve('.config/gcloud/application_default_credentials.json'), - ); - } - if (await credFile.exists()) { - return await obtainFromFile(credFile); + return await auth.obtainAccessCredentialsViaMetadataServer(client); + } finally { + if (httpClient == null) { + client.close(); + } } - - return await auth.obtainAccessCredentialsViaMetadataServer(client); } return () async { try { - var creds = credentials ??= await obtainCredentials(); + var future = credentialsFuture ??= obtainCredentials(); + var creds = await future; final threshold = DateTime.now().toUtc().add(const Duration(minutes: 5)); if (creds.accessToken.expiry.isBefore(threshold)) { - creds = credentials = await obtainCredentials(); + future = credentialsFuture = obtainCredentials(); + creds = await future; } return creds.accessToken.data; } on Exception catch (e) { + credentialsFuture = null; throw CredentialsException('Failed to obtain or refresh access token', e); } }; From ed9b3870afa9bd53c1c3495e21051270ef0194fb Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Thu, 21 May 2026 14:45:53 +0000 Subject: [PATCH 10/18] Regenerate workspace dependency diagram and update docs to include google_cloud_pubsub --- DEVELOPER_GUIDE.md | 4 ++++ README.md | 1 + pkgs/google_cloud_pubsub/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/DEVELOPER_GUIDE.md b/DEVELOPER_GUIDE.md index 6b5393f8..eec4ac61 100644 --- a/DEVELOPER_GUIDE.md +++ b/DEVELOPER_GUIDE.md @@ -32,6 +32,7 @@ graph TD google_cloud_language_v2["language_v2"] google_cloud_location["location"] google_cloud_longrunning["longrunning"] + google_cloud_pubsub["pubsub"] google_cloud_storage["storage"] end @@ -93,6 +94,9 @@ graph TD google_cloud_logging_v2 --> google_cloud_rpc google_cloud_longrunning --> google_cloud_protobuf google_cloud_longrunning --> google_cloud_rpc + google_cloud_pubsub --> google_cloud + google_cloud_pubsub --> google_cloud_protobuf + google_cloud_pubsub --> google_cloud_rpc google_cloud_rpc --> google_cloud_protobuf google_cloud_secretmanager_v1 --> google_cloud_iam_v1 google_cloud_secretmanager_v1 --> google_cloud_location diff --git a/README.md b/README.md index b126fdee..b479e981 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Program](https://bughunters.google.com/open-source-security). | [`google_cloud_logging_v2`](https://pub.dev/packages/google_cloud_logging_v2) | [![pub package](https://img.shields.io/pub/v/google_cloud_logging_v2.svg)](https://pub.dev/packages/google_cloud_logging_v2) | [generated/google_cloud_logging_v2](generated/google_cloud_logging_v2) | | [`google_cloud_longrunning`](https://pub.dev/packages/google_cloud_longrunning) | [![pub package](https://img.shields.io/pub/v/google_cloud_longrunning.svg)](https://pub.dev/packages/google_cloud_longrunning) | [generated/google_cloud_longrunning](generated/google_cloud_longrunning) | | [`google_cloud_protobuf`](https://pub.dev/packages/google_cloud_protobuf) | [![pub package](https://img.shields.io/pub/v/google_cloud_protobuf.svg)](https://pub.dev/packages/google_cloud_protobuf) | [generated/google_cloud_protobuf](generated/google_cloud_protobuf) | +| [`google_cloud_pubsub`](https://pub.dev/packages/google_cloud_pubsub) | [![pub package](https://img.shields.io/pub/v/google_cloud_pubsub.svg)](https://pub.dev/packages/google_cloud_pubsub) | [pkgs/google_cloud_pubsub](pkgs/google_cloud_pubsub) | | [`google_cloud_rpc`](https://pub.dev/packages/google_cloud_rpc) | [![pub package](https://img.shields.io/pub/v/google_cloud_rpc.svg)](https://pub.dev/packages/google_cloud_rpc) | [generated/google_cloud_rpc](generated/google_cloud_rpc) | | [`google_cloud_secretmanager_v1`](https://pub.dev/packages/google_cloud_secretmanager_v1) | [![pub package](https://img.shields.io/pub/v/google_cloud_secretmanager_v1.svg)](https://pub.dev/packages/google_cloud_secretmanager_v1) | [generated/google_cloud_secretmanager_v1](generated/google_cloud_secretmanager_v1) | | [`google_cloud_shelf`](https://pub.dev/packages/google_cloud_shelf) | [![pub package](https://img.shields.io/pub/v/google_cloud_shelf.svg)](https://pub.dev/packages/google_cloud_shelf) | [pkgs/google_cloud_shelf](pkgs/google_cloud_shelf) | diff --git a/pkgs/google_cloud_pubsub/pubspec.yaml b/pkgs/google_cloud_pubsub/pubspec.yaml index 724da107..bedf3122 100644 --- a/pkgs/google_cloud_pubsub/pubspec.yaml +++ b/pkgs/google_cloud_pubsub/pubspec.yaml @@ -13,7 +13,7 @@ resolution: workspace dependencies: collection: ^1.19.1 ffi: ^2.2.0 - google_cloud: '>=0.3.0 <0.5.0' + google_cloud: '>=0.3.0 <0.6.0' google_cloud_protobuf: ^0.5.0 google_cloud_rpc: ^0.5.0 googleapis_auth: ^2.0.0 From c34002ddf669cb8b0fd667bccbdf6e15fa8f0828 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Fri, 19 Jun 2026 08:33:24 +0000 Subject: [PATCH 11/18] feat(pubsub): add handwritten client code Introduce the handwritten client code (PubSub, Topic, Subscription, Message) on top of the generated gRPC code. - Implement PubSub client with emulator support. - Implement Topic and Subscription resource management. - Implement streaming pull and unary fallback for message acknowledgments. - Add unit and integration tests. - Add usage examples in README and example/example.dart. TAG=agy CONV=06ddc172-e8da-4e30-bab8-139c539520f9 --- DEVELOPER_GUIDE.md | 5 +- pkgs/google_cloud_pubsub/README.md | 56 +- pkgs/google_cloud_pubsub/example/example.dart | 40 ++ .../lib/google_cloud_pubsub.dart | 16 +- pkgs/google_cloud_pubsub/lib/src/client.dart | 574 ++++++++++++++++++ .../lib/src/exceptions.dart | 93 +++ pkgs/google_cloud_pubsub/lib/src/message.dart | 110 ++++ .../lib/src/pubsub_emulator_host_vm.dart | 93 +++ .../lib/src/subscription.dart | 175 ++++++ pkgs/google_cloud_pubsub/lib/src/topic.dart | 98 +++ pkgs/google_cloud_pubsub/pubspec.yaml | 9 +- .../test/integration_test.dart | 334 ++++++++++ pkgs/google_cloud_pubsub/test/unit_test.dart | 340 +++++++++++ 13 files changed, 1934 insertions(+), 9 deletions(-) create mode 100644 pkgs/google_cloud_pubsub/example/example.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/client.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/exceptions.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/message.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/subscription.dart create mode 100644 pkgs/google_cloud_pubsub/lib/src/topic.dart create mode 100644 pkgs/google_cloud_pubsub/test/integration_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/unit_test.dart diff --git a/DEVELOPER_GUIDE.md b/DEVELOPER_GUIDE.md index eb0dcbba..c5ca4952 100644 --- a/DEVELOPER_GUIDE.md +++ b/DEVELOPER_GUIDE.md @@ -17,7 +17,6 @@ graph TD subgraph Tier0 ["Tier 0 (Publish First)"] google_cloud["google_cloud"] google_cloud_protobuf["protobuf"] - google_cloud_pubsub["pubsub"] end subgraph Tier1 ["Tier 1"] @@ -33,6 +32,7 @@ graph TD google_cloud_language_v2["language_v2"] google_cloud_location["location"] google_cloud_longrunning["longrunning"] + google_cloud_pubsub["pubsub"] google_cloud_storage["storage"] end @@ -93,6 +93,9 @@ graph TD google_cloud_logging_v2 --> google_cloud_rpc google_cloud_longrunning --> google_cloud_protobuf google_cloud_longrunning --> google_cloud_rpc + google_cloud_pubsub --> google_cloud + google_cloud_pubsub --> google_cloud_protobuf + google_cloud_pubsub --> google_cloud_rpc google_cloud_rpc --> google_cloud_protobuf google_cloud_secretmanager_v1 --> google_cloud_iam_v1 google_cloud_secretmanager_v1 --> google_cloud_location diff --git a/pkgs/google_cloud_pubsub/README.md b/pkgs/google_cloud_pubsub/README.md index 9162ab7d..7ee16c31 100644 --- a/pkgs/google_cloud_pubsub/README.md +++ b/pkgs/google_cloud_pubsub/README.md @@ -17,9 +17,59 @@ A Dart client for Google Cloud Pub/Sub. > feedback, suggestions, and comments, please file an issue in the > [bug tracker](https://github.com/googleapis/google-cloud-dart/issues). -## Usage +## Using Google Cloud PubSub -This package contains generated gRPC client code for Google Cloud Pub/Sub. +All access to Google Cloud Pub/Sub is made through the `PubSub` class. -For details on how to use the generated gRPC client, please refer to the gRPC and Protobuf documentation. +```dart +import 'dart:convert'; +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +void main() async { + // Note: You must provide an `authenticator` for authentication in production. + final pubSub = PubSub( + projectId: 'your-project-id', + authenticator: await applicationDefaultCredentialsAuthenticator( + ['https://www.googleapis.com/auth/pubsub'], + ), + ); + + // Create a topic. + final topic = await pubSub.topic('put-your-topic-name-here').create(); + + // Create a subscription to that topic. + final subscription = await pubSub + .subscription('put-your-subscription-name-here') + .create(topic: topic.name); + + // Publish a message. + await topic.publish(utf8.encode('message 1')); + + // Pull messages from the subscription. + final messages = await subscription.pull(maxMessages: 1); + + for (final receivedMessage in messages) { + print('Received message: ${utf8.decode(receivedMessage.data)}'); + + // Acknowledge the message. + await subscription.acknowledge([receivedMessage.ackId]); + } + + print( + 'Your topic is available at:\n' + 'https://pubsub.googleapis.com/v1/${topic.name}', + ); + + // Clean up. + await subscription.delete(); + await topic.delete(); + + pubSub.close(); +} +``` + +> [!NOTE] +> You must [set up authentication][] before using this package outside of +> Google Cloud. + +[set up authentication]: https://docs.cloud.google.com/pubsub/docs/reference/libraries#authentication diff --git a/pkgs/google_cloud_pubsub/example/example.dart b/pkgs/google_cloud_pubsub/example/example.dart new file mode 100644 index 00000000..aae03be4 --- /dev/null +++ b/pkgs/google_cloud_pubsub/example/example.dart @@ -0,0 +1,40 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; + +/// An example demonstrating how to initialize and use the [PubSub] client +/// with Google Application Default Credentials (ADC) authentication. +Future main() async { + // Asynchronously construct the ADC authenticator with the required Pub/Sub scope. + final authenticator = await applicationDefaultCredentialsAuthenticator([ + 'https://www.googleapis.com/auth/pubsub', + ]); + + // Pass the authenticator to the PubSub client constructor. + final pubsub = PubSub( + projectId: 'my-project-id', + authenticator: authenticator, + ); + + try { + // The client will use the authenticator to make authenticated requests. + final topic = pubsub.topic('my-topic'); + print('Successfully initialized client for topic: ${topic.topicId}'); + } finally { + await pubsub.close(); + } +} diff --git a/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart b/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart index 76d683ca..dd63f35f 100644 --- a/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart +++ b/pkgs/google_cloud_pubsub/lib/google_cloud_pubsub.dart @@ -12,7 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -export 'src/generated/google/pubsub/v1/pubsub.pb.dart'; -export 'src/generated/google/pubsub/v1/pubsub.pbgrpc.dart'; -export 'src/generated/google/pubsub/v1/schema.pb.dart'; -export 'src/generated/google/pubsub/v1/schema.pbgrpc.dart'; +export 'package:grpc/grpc.dart' + show + BaseAuthenticator, + ComputeEngineAuthenticator, + ServiceAccountAuthenticator, + applicationDefaultCredentialsAuthenticator; + +export 'src/client.dart' show PubSub; +export 'src/exceptions.dart'; +export 'src/message.dart' show Message, ReceivedMessage; +export 'src/subscription.dart' show Subscription; +export 'src/topic.dart' show Topic; diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart new file mode 100644 index 00000000..0323bfd6 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -0,0 +1,574 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'package:grpc/grpc.dart'; +import 'package:meta/meta.dart'; +import '../google_cloud_pubsub.dart'; +import 'generated/google/pubsub/v1/pubsub.pbgrpc.dart' as grpc; +import 'pubsub_emulator_host_vm.dart'; +import 'subscription.dart' show newSubscription, newSubscriptionName; +import 'topic.dart' show newTopic, newTopicName; + +/// API for flexible, reliable, large-scale messaging. +/// +/// See [Google Cloud Pub/Sub](https://cloud.google.com/pubsub). +final class PubSub { + /// The project ID of this client. + final String projectId; + final ClientChannel _channel; + final bool _isEmulator; + grpc.PublisherClient? _publisherClient; + grpc.SubscriberClient? _subscriberClient; + final BaseAuthenticator? _authenticator; + + static String? _calculateProjectId(String? projectId, String? emulatorHost) => + switch ((projectId, emulatorHost)) { + (final String projectId, _) => projectId, + (null, _?) => projectFromEnvironment ?? 'test-project', + (null, null) => projectFromEnvironment, + }; + + static ClientChannel _calculateChannel( + String? apiEndpoint, + String? emulatorHost, + ) { + if (apiEndpoint != null) { + return ClientChannel( + apiEndpoint, + options: const ChannelOptions(credentials: ChannelCredentials.secure()), + ); + } + + if (emulatorHost case String host) { + final uri = host.startsWith('http://') || host.startsWith('https://') + ? Uri.parse(host) + : Uri.http(host); + return ClientChannel( + uri.host, + port: uri.hasPort ? uri.port : 8085, + options: const ChannelOptions( + credentials: ChannelCredentials.insecure(), + ), + ); + } + + return ClientChannel( + 'pubsub.googleapis.com', + options: const ChannelOptions(credentials: ChannelCredentials.secure()), + ); + } + + PubSub._( + this.projectId, + this._channel, + this._isEmulator, + this._authenticator, { + grpc.SubscriberClient? subscriberClient, + grpc.PublisherClient? publisherClient, + }) : _subscriberClient = subscriberClient, + _publisherClient = publisherClient; + + @visibleForTesting + factory PubSub.testing({ + required String projectId, + required ClientChannel channel, + grpc.SubscriberClient? subscriberClient, + grpc.PublisherClient? publisherClient, + }) => PubSub._( + projectId, + channel, + false, + null, + subscriberClient: subscriberClient, + publisherClient: publisherClient, + ); + + /// Turns the protobuf-generated [grpc.ReceivedMessage] into a + /// [ReceivedMessage]. + static ReceivedMessage _mapReceivedMessage( + grpc.ReceivedMessage m, { + FutureOr Function(List ackIds)? ackHandler, + FutureOr Function(List ackIds, int seconds)? + modifyDeadlineHandler, + }) => ReceivedMessage( + ackId: m.ackId, + messageId: m.message.messageId, + publishTime: m.message.publishTime.toDateTime(), + message: Message(data: m.message.data, attributes: m.message.attributes), + ackHandler: ackHandler, + modifyDeadlineHandler: modifyDeadlineHandler, + ); + + /// Constructs a client used to communicate with [Google Cloud Pub/Sub][]. + /// + /// The [projectId] is the Google Cloud Project ID. If not provided, it will + /// be inferred from the environment. + /// + /// Project ID inference strategies: + /// 1. Reads the `GOOGLE_CLOUD_PROJECT` environment variable. + /// 2. If the `PUBSUB_EMULATOR_HOST` environment variable is set (indicating + /// the emulator is active), it defaults to `'test-project'`. + /// + /// Throws if [projectId] is not provided and cannot be + /// inferred from the environment. + /// + /// For authentication, an [authenticator] can be supplied to obtain + /// and refresh access credentials for authenticating gRPC requests. + /// + /// If no [authenticator] is provided, requests are made without + /// authentication. + factory PubSub({ + String? projectId, + String? apiEndpoint, + BaseAuthenticator? authenticator, + }) { + final emulatorHost = pubsubEmulatorHost; + final resolvedProjectId = _calculateProjectId(projectId, emulatorHost); + if (resolvedProjectId == null) { + throw ArgumentError( + 'A project ID is required, but none was provided or could be ' + 'inferred from the environment.', + ); + } + return PubSub._( + resolvedProjectId, + _calculateChannel(apiEndpoint, emulatorHost), + emulatorHost != null, + authenticator, + ); + } + + Future get _callOptions async { + if (_isEmulator) { + return CallOptions(); + } + final authenticator = _authenticator; + if (authenticator == null) { + return CallOptions(); + } + return authenticator.toCallOptions; + } + + grpc.PublisherClient get _publisher => + _publisherClient ??= grpc.PublisherClient(_channel); + grpc.SubscriberClient get _subscriber => + _subscriberClient ??= grpc.SubscriberClient(_channel); + + /// Closes the client and cleans up any resources associated with it. + Future close() async { + await _channel.shutdown(); + } + + // Topic-related methods + + /// A [Topic] object with the given [unqualifiedName] in the client's project. + Topic topic(String unqualifiedName) => newTopic(this, unqualifiedName); + + /// A [Topic] object with the given [name]. + /// + /// The [name] must be in the format `projects//topics/`. + /// Useful for cross-project access. + Topic topicName(String name) => newTopicName(this, name); + + /// A [Subscription] object with the given [unqualifiedName] in the client's + /// project. + Subscription subscription(String unqualifiedName) => + newSubscription(this, unqualifiedName); + + /// A [Subscription] object with the given [name]. + /// + /// The [name] must be in the format + /// `projects//subscriptions/`. + /// Useful for cross-project access. + Subscription subscriptionName(String name) => newSubscriptionName(this, name); + + /// Creates the given topic with the given [name]. + /// + /// The [name] must be in the format `projects//topics/`. + /// + /// Throws a [TopicAlreadyExistsException] if the topic already exists. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.CreateTopic). + // TODO(sigurdm): Support configuring topic options (labels, + // messageStoragePolicy, kmsKeyName, schemaSettings, + // messageRetentionDuration). + Future createTopic(String name) async { + final topic = grpc.Topic()..name = name; + try { + await _publisher.createTopic(topic, options: await _callOptions); + return topicName(name); + } on GrpcError catch (e) { + if (e.code == StatusCode.alreadyExists) { + throw TopicAlreadyExistsException(name); + } + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } + } + + /// Deletes the topic with the given [name]. + /// + /// The [name] must be in the format `projects//topics/`. + /// + /// Returns `true` if the topic was deleted, or `false` if the topic did not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.DeleteTopic). + Future deleteTopic(String name) async { + final request = grpc.DeleteTopicRequest()..topic = name; + try { + await _publisher.deleteTopic(request, options: await _callOptions); + return true; + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + return false; + } + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } + } + + /// Adds one or more messages to the topic. + /// + /// The [name] must be in the format `projects//topics/`. + /// + /// Throws a [TopicNotFoundException] if the topic does not exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.Publish). + // TODO(sigurdm): Support batch publishing (publishMany) for high-throughput. + Future publish( + String name, + List data, { + Map? attributes, + }) async { + final message = grpc.PubsubMessage()..data = data; + if (attributes != null) { + message.attributes.addAll(attributes); + } + + final request = grpc.PublishRequest() + ..topic = name + ..messages.add(message); + + try { + final response = await _publisher.publish( + request, + options: await _callOptions, + ); + return response.messageIds.first; + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + throw TopicNotFoundException(name); + } + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } + } + + // TODO(sigurdm): Implement missing Publisher APIs: + // - GetTopic + // - UpdateTopic + // - ListTopics + // - ListTopicSubscriptions + // - ListTopicSnapshots + // - DetachSubscription + + // Subscription-related methods + + /// Creates a subscription to a given topic. + /// + /// The [name] must be in the format + /// `projects//subscriptions/`. + /// The [topic] must be in the format `projects//topics/`. + /// + /// Throws a [SubscriptionAlreadyExistsException] if the subscription already + /// exists. + /// Throws a [TopicNotFoundException] if the corresponding topic doesn't + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.CreateSubscription). + // TODO(sigurdm): Support configuring subscription options + // (ackDeadlineSeconds, pushConfig, deadLetterPolicy, retryPolicy, + // retainAckedMessages, enableExactlyOnceDelivery). + Future createSubscription( + String name, { + required String topic, + }) async { + final subscription = grpc.Subscription() + ..name = name + ..topic = topic; + + try { + await _subscriber.createSubscription( + subscription, + options: await _callOptions, + ); + return subscriptionName(name); + } on GrpcError catch (e) { + if (e.code == StatusCode.alreadyExists) { + throw SubscriptionAlreadyExistsException(name); + } + if (e.code == StatusCode.notFound) { + throw TopicNotFoundException(topic); + } + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } + } + + /// Deletes an existing subscription. + /// + /// The [name] must be in the format + /// `projects//subscriptions/`. + /// + /// All messages retained in the subscription are immediately dropped. + /// + /// Returns `true` if the subscription was deleted, or `false` if the + /// subscription did not exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.DeleteSubscription). + Future deleteSubscription(String name) async { + final request = grpc.DeleteSubscriptionRequest()..subscription = name; + try { + await _subscriber.deleteSubscription( + request, + options: await _callOptions, + ); + return true; + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + return false; + } + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } + } + + /// Pulls messages from the server. + /// + /// The [name] must be in the format + /// `projects//subscriptions/`. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Pull). + Future> pull(String name, {int maxMessages = 1}) async { + final request = grpc.PullRequest() + ..subscription = name + ..maxMessages = maxMessages; + + try { + final response = await _subscriber.pull( + request, + options: await _callOptions, + ); + + return response.receivedMessages + .map( + (m) => _mapReceivedMessage( + m, + ackHandler: (ackIds) => acknowledge(name, ackIds), + modifyDeadlineHandler: (ackIds, seconds) => + modifyAckDeadline(name, ackIds, seconds), + ), + ) + .toList(); + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + throw SubscriptionNotFoundException(name); + } + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } + } + + /// Establishes a stream with the server, which sends messages down to the + /// client. + /// + /// The [name] must be in the format + /// `projects//subscriptions/`. + /// + /// The client streams acknowledgments and ack deadline modifications + /// back to the server. If an error occurs (including when the server closes + /// the stream with status `UNAVAILABLE` to reassign resources), the stream + /// will throw a [StreamBrokenException]. In this case, the caller should + /// re-establish the stream. Flow control can be achieved by configuring the + /// underlying RPC channel. + /// + /// Throws a [StreamBrokenException] if the stream is broken by the server or + /// network. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.StreamingPull). + Stream streamingPull( + String name, { + int streamAckDeadlineSeconds = 10, + }) async* { + final requestController = StreamController(); + try { + final options = await _callOptions; + requestController.add( + grpc.StreamingPullRequest() + ..subscription = name + ..streamAckDeadlineSeconds = streamAckDeadlineSeconds, + ); + // TODO(sigurdm): Retry on broken connections. + final responseStream = _subscriber.streamingPull( + requestController.stream, + options: options, + ); + await for (final response in responseStream) { + for (final m in response.receivedMessages) { + yield _mapReceivedMessage( + m, + // NOTE: Using unary RPCs for acks and deadline modifications + // + // TODO(sigurdm): implement ack/deadline pipelining. + ackHandler: (ackIds) => acknowledge(name, ackIds), + modifyDeadlineHandler: (ackIds, seconds) => + modifyAckDeadline(name, ackIds, seconds), + ); + } + } + } on GrpcError catch (e) { + throw StreamBrokenException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } finally { + await requestController.close(); + } + } + + /// Acknowledges the messages associated with the `ack_ids`. + /// + /// The [name] must be in the format + /// `projects//subscriptions/`. + /// + /// The Pub/Sub system can remove the relevant messages from the subscription. + /// + /// Acknowledging a message whose ack deadline has expired may succeed, + /// but such a message may be redelivered later. Acknowledging a message more + /// than once will not result in an error. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Acknowledge). + Future acknowledge(String name, List ackIds) async { + final request = grpc.AcknowledgeRequest() + ..subscription = name + ..ackIds.addAll(ackIds); + + try { + await _subscriber.acknowledge(request, options: await _callOptions); + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + throw SubscriptionNotFoundException(name); + } + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } + } + + /// Modifies the ack deadline for a list of specific messages. + /// + /// The [name] must be in the format + /// `projects//subscriptions/`. + /// + /// This method is useful to indicate that more time is needed to process a + /// message by the subscriber, or to make the message available for redelivery + /// if the processing was interrupted. Note that this does not modify the + /// subscription-level `ackDeadlineSeconds` used for subsequent messages. + /// + /// Modifying the ack deadline for messages whose deadline has already expired + /// may succeed, but those messages may have already been redelivered or + /// made available for redelivery. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.ModifyAckDeadline). + Future modifyAckDeadline( + String name, + List ackIds, + int ackDeadlineSeconds, + ) async { + final request = grpc.ModifyAckDeadlineRequest() + ..subscription = name + ..ackIds.addAll(ackIds) + ..ackDeadlineSeconds = ackDeadlineSeconds; + + try { + await _subscriber.modifyAckDeadline(request, options: await _callOptions); + } on GrpcError catch (e) { + if (e.code == StatusCode.notFound) { + throw SubscriptionNotFoundException(name); + } + throw PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } + } + + // TODO(sigurdm): Implement missing Subscriber APIs: + // - GetSubscription + // - UpdateSubscription + // - ListSubscriptions + // - ModifyPushConfig + // - GetSnapshot + // - ListSnapshots + // - CreateSnapshot + // - UpdateSnapshot + // - DeleteSnapshot + // - Seek + + // TODO(sigurdm): Implement missing Schema APIs: + // - CreateSchema + // - GetSchema + // - ListSchemas + // - ListSchemaRevisions + // - CommitSchema + // - RollbackSchema + // - DeleteSchemaRevision + // - DeleteSchema + // - ValidateSchema + // - ValidateMessage +} diff --git a/pkgs/google_cloud_pubsub/lib/src/exceptions.dart b/pkgs/google_cloud_pubsub/lib/src/exceptions.dart new file mode 100644 index 00000000..12bac811 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/exceptions.dart @@ -0,0 +1,93 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Base class for all exceptions thrown by the google_cloud_pubsub package. +abstract final class PubSubException implements Exception {} + +/// Thrown when a topic is not found. +final class TopicNotFoundException implements PubSubException { + /// The name of the topic that was not found. + final String name; + + TopicNotFoundException(this.name); + + @override + String toString() => 'TopicNotFoundException: Topic "$name" not found.'; +} + +/// Thrown when a topic already exists. +final class TopicAlreadyExistsException implements PubSubException { + /// The name of the topic that already exists. + final String name; + + TopicAlreadyExistsException(this.name); + + @override + String toString() => + 'TopicAlreadyExistsException: Topic "$name" already exists.'; +} + +/// Thrown when a subscription already exists. +final class SubscriptionAlreadyExistsException implements PubSubException { + /// The name of the subscription that already exists. + final String name; + + SubscriptionAlreadyExistsException(this.name); + + @override + String toString() => + 'SubscriptionAlreadyExistsException: Subscription "$name" ' + 'already exists.'; +} + +/// Thrown when a subscription is not found. +final class SubscriptionNotFoundException implements PubSubException { + /// The name of the subscription that was not found. + final String name; + + SubscriptionNotFoundException(this.name); + + @override + String toString() => + 'SubscriptionNotFoundException: Subscription "$name" not found.'; +} + +/// Thrown when a streaming pull connection is broken. +final class StreamBrokenException implements PubSubException { + final int code; + final String message; + final Map trailers; + + StreamBrokenException(this.code, this.message, [this.trailers = const {}]); + + @override + String toString() => 'StreamBrokenException: [$code] $message'; +} + +/// Thrown when a Pub/Sub operation fails due to a gRPC error. +final class PubSubOperationException implements PubSubException { + /// The gRPC status code. + final int code; + + /// The error message. + final String message; + + /// The trailers from the gRPC error. + final Map trailers; + + PubSubOperationException(this.code, this.message, [this.trailers = const {}]); + + @override + String toString() => 'PubSubOperationException: [$code] $message'; +} diff --git a/pkgs/google_cloud_pubsub/lib/src/message.dart b/pkgs/google_cloud_pubsub/lib/src/message.dart new file mode 100644 index 00000000..1ee83e16 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/message.dart @@ -0,0 +1,110 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:async'; + +import 'dart:typed_data'; + +import 'exceptions.dart'; +import 'subscription.dart'; + +/// A Pub/Sub message. +final class Message { + /// The message data. + final Uint8List data; + + /// Optional attributes for this message. + final Map attributes; + + Message({required List data, Map? attributes}) + : data = data is Uint8List ? data : Uint8List.fromList(data), + attributes = attributes ?? const {}; +} + +/// A message received from a subscription. +final class ReceivedMessage { + /// The ack ID for this message. + final String ackId; + + /// The received message. + final Message message; + + /// The ID of this message, assigned by the server. + final String messageId; + + /// The time at which the message was published. + final DateTime publishTime; + + final FutureOr Function(List ackIds)? _ackHandler; + final FutureOr Function(List ackIds, int seconds)? + _modifyDeadlineHandler; + + ReceivedMessage({ + required this.ackId, + required this.messageId, + required this.publishTime, + required this.message, + FutureOr Function(List ackIds)? ackHandler, + FutureOr Function(List ackIds, int seconds)? + modifyDeadlineHandler, + }) : _ackHandler = ackHandler, + _modifyDeadlineHandler = modifyDeadlineHandler; + + /// The message data. + Uint8List get data => message.data; + + /// Optional attributes for this message. + Map get attributes => message.attributes; + + /// Acknowledges the message. + /// + /// If this message was received via [Subscription.pull], it will call + /// [Subscription.acknowledge]. + /// If it was received via [Subscription.streamingPull], it will send an + /// acknowledgment request over the existing stream. + /// + /// Throws a [PubSubException] if the acknowledgment fails (for example, if + /// the subscription does not exist or there is a network error). + Future ack() async { + final handler = _ackHandler; + if (handler != null) { + await handler([ackId]); + } + } + + /// Modifies the ack deadline for this message. + /// + /// [seconds] must be the new ack deadline in seconds, relative to the + /// time this method is called. For example, if [seconds] is 10, the new ack + /// deadline is 10 seconds from now. Specifying 0 makes the message + /// immediately available for redelivery. + /// + /// If this message was received via [Subscription.pull], it will call + /// [Subscription.modifyAckDeadline]. + /// If it was received via [Subscription.streamingPull], it will send a + /// modification request over the existing stream. + /// + /// Modifying the ack deadline for a message whose deadline has already + /// expired may succeed, but the message may have already been redelivered + /// or made available for redelivery. + /// + /// Throws a [PubSubException] if the modification fails (for example, if the + /// subscription does not exist or there is a network error). + Future modifyAckDeadline(int seconds) async { + final handler = _modifyDeadlineHandler; + if (handler != null) { + await handler([ackId], seconds); + } + } +} diff --git a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart new file mode 100644 index 00000000..893448ff --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart @@ -0,0 +1,93 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:ffi'; +import 'dart:io'; + +import 'package:ffi/ffi.dart'; +import 'package:meta/meta.dart'; + +final _getenv = DynamicLibrary.process() + .lookupFunction< + Pointer Function(Pointer), + Pointer Function(Pointer) + >('getenv'); + +final _getEnvironmentVariableW = DynamicLibrary.open('kernel32.dll') + .lookupFunction< + Int32 Function(Pointer, Pointer, Int32), + int Function(Pointer, Pointer, int) + >('GetEnvironmentVariableW'); + +String? _posixEnvironmentVariable(String name) => using((arena) { + final namePtr = name.toNativeUtf8(allocator: arena); + final valuePtr = _getenv(namePtr); + if (valuePtr == nullptr) { + return null; + } + return valuePtr.toDartString(); +}); + +String? _windowsEnvironmentVariable(String name) => using((arena) { + final namePtr = name.toNativeUtf16(allocator: arena); + // First call to determine size. + // size includes the terminating null character. + final size = _getEnvironmentVariableW(namePtr, nullptr, 0); + if (size == 0) { + return null; // Variable not found. + } + + final buffer = arena(size).cast(); + final finalSize = _getEnvironmentVariableW(namePtr, buffer, size); + if (finalSize == 0 && size > 1) { + // If it failed the second time, but size was > 1 (meaning it existed and + // wasn't empty), then something went wrong. + return null; + } + // finalSize is the number of characters stored, NOT including null. + // If finalSize is 0 and size was 1, it's an empty string. + return buffer.toDartString(); +}); + +String? _environmentVariable(String name) { + if (Platform.isWindows) { + return _windowsEnvironmentVariable(name); + } else { + return _posixEnvironmentVariable(name); + } +} + +/// The host and port of the Google Cloud Pub/Sub emulator, if set. +/// +/// Reads the `PUBSUB_EMULATOR_HOST` environment variable directly using native +/// code. [Platform.environment] is not used because it is cached and immutable +/// and the emulator configuration might not be available until the application +/// is launched. +@internal +String? get pubsubEmulatorHost { + final host = _environmentVariable('PUBSUB_EMULATOR_HOST'); + if (host?.isEmpty ?? true) return null; + return host; +} + +/// The project ID inferred from the environment. +/// +/// Reads the `GOOGLE_CLOUD_PROJECT` environment variable directly using native +/// code. +@internal +String? get projectFromEnvironment { + final project = _environmentVariable('GOOGLE_CLOUD_PROJECT'); + if (project?.isEmpty ?? true) return null; + return project; +} diff --git a/pkgs/google_cloud_pubsub/lib/src/subscription.dart b/pkgs/google_cloud_pubsub/lib/src/subscription.dart new file mode 100644 index 00000000..cd483bca --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/subscription.dart @@ -0,0 +1,175 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:meta/meta.dart'; + +import '../google_cloud_pubsub.dart'; + +@internal +Subscription newSubscription(PubSub pubsub, String subscriptionId) => + Subscription.unqualified(pubsub, subscriptionId); + +@internal +Subscription newSubscriptionName(PubSub pubsub, String name) => + Subscription(pubsub, name); + +/// A [Google Cloud Pub/Sub subscription](https://cloud.google.com/pubsub/docs/overview#subscriptions). +final class Subscription { + static final RegExp _subscriptionNameRegExp = RegExp( + r'^projects/[^/]+/subscriptions/[^/]+$', + ); + + /// The [PubSub] client associated with this subscription. + final PubSub pubsub; + + /// The fully qualified resource name of this subscription. + /// + /// It has the format `projects//subscriptions/`. + final String name; + + /// A subscription with the given [subscriptionId] in the client's project. + Subscription.unqualified(this.pubsub, String subscriptionId) + : name = 'projects/${pubsub.projectId}/subscriptions/$subscriptionId' { + _validateName(name); + } + + /// A subscription with the given [name]. + /// + /// The [name] must be in the format + /// `projects//subscriptions/`. + /// Useful for cross-project access. + Subscription(this.pubsub, this.name) { + _validateName(name); + } + + static void _validateName(String name) { + if (!_subscriptionNameRegExp.hasMatch(name)) { + throw ArgumentError.value( + name, + 'name', + 'Must be in the format projects//subscriptions/', + ); + } + } + + /// The ID of this subscription. + String get subscriptionId => name.split('/').last; + + /// Creates a subscription to a given topic. + /// + /// Throws a [SubscriptionAlreadyExistsException] if the subscription already + /// exists. + /// Throws a [TopicNotFoundException] if the corresponding topic doesn't + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.CreateSubscription). + Future create({required String topic}) => + pubsub.createSubscription(name, topic: topic); + + /// Deletes an existing subscription. + /// + /// All messages retained in the subscription are immediately dropped. + /// + /// Returns `true` if the subscription was deleted, or `false` if the + /// subscription did not exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.DeleteSubscription). + Future delete() => pubsub.deleteSubscription(name); + + /// Pulls messages from the server. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Pull). + Future> pull({int maxMessages = 1}) { + if (maxMessages <= 0) { + throw ArgumentError.value( + maxMessages, + 'maxMessages', + 'Must be greater than 0', + ); + } + return pubsub.pull(name, maxMessages: maxMessages); + } + + /// Establishes a stream with the server, which sends messages down to the + /// client. + /// + /// The client streams acknowledgments and ack deadline modifications + /// back to the server. If an error occurs (including when the server closes + /// the stream with status `UNAVAILABLE` to reassign resources), the stream + /// will throw a [StreamBrokenException]. In this case, the caller should + /// re-establish the stream. Flow control can be achieved by configuring the + /// underlying RPC channel. + /// + /// Throws a [StreamBrokenException] if the stream is broken by the server or + /// network. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.StreamingPull). + Stream streamingPull({int streamAckDeadlineSeconds = 10}) { + if (streamAckDeadlineSeconds < 10 || streamAckDeadlineSeconds > 600) { + throw ArgumentError.value( + streamAckDeadlineSeconds, + 'streamAckDeadlineSeconds', + 'Must be between 10 and 600 seconds', + ); + } + return pubsub.streamingPull( + name, + streamAckDeadlineSeconds: streamAckDeadlineSeconds, + ); + } + + /// Acknowledges the messages associated with the `ack_ids`. + /// + /// The Pub/Sub system can remove the relevant messages from the subscription. + /// + /// Acknowledging a message whose ack deadline has expired may succeed, + /// but such a message may be redelivered later. Acknowledging a message more + /// than once will not result in an error. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Acknowledge). + Future acknowledge(List ackIds) => + pubsub.acknowledge(name, ackIds); + + /// Modifies the ack deadline for a list of specific messages. + /// + /// This method is useful to indicate that more time is needed to process a + /// message by the subscriber, or to make the message available for redelivery + /// if the processing was interrupted. Note that this does not modify the + /// subscription-level `ackDeadlineSeconds` used for subsequent messages. + /// + /// Modifying the ack deadline for messages whose deadline has already expired + /// may succeed, but those messages may have already been redelivered or + /// made available for redelivery. + /// + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.ModifyAckDeadline). + Future modifyAckDeadline(List ackIds, int ackDeadlineSeconds) { + if (ackDeadlineSeconds < 0) { + throw ArgumentError.value( + ackDeadlineSeconds, + 'ackDeadlineSeconds', + 'Must be non-negative', + ); + } + return pubsub.modifyAckDeadline(name, ackIds, ackDeadlineSeconds); + } +} diff --git a/pkgs/google_cloud_pubsub/lib/src/topic.dart b/pkgs/google_cloud_pubsub/lib/src/topic.dart new file mode 100644 index 00000000..0c18fd24 --- /dev/null +++ b/pkgs/google_cloud_pubsub/lib/src/topic.dart @@ -0,0 +1,98 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:meta/meta.dart'; + +import '../google_cloud_pubsub.dart'; + +@internal +Topic newTopic(PubSub pubsub, String topicId) => + Topic.unqualified(pubsub, topicId); + +@internal +Topic newTopicName(PubSub pubsub, String name) => Topic(pubsub, name); + +/// A [Google Cloud Pub/Sub topic](https://cloud.google.com/pubsub/docs/overview#topics). +final class Topic { + static final RegExp _topicNameRegExp = RegExp( + r'^projects/[^/]+/topics/[^/]+$', + ); + + /// The [PubSub] client associated with this topic. + final PubSub pubsub; + + /// The fully qualified resource name of this topic. + /// + /// It has the format `projects//topics/`. + final String name; + + /// A topic with the given [topicId] in the client's project. + Topic.unqualified(this.pubsub, String topicId) + : name = 'projects/${pubsub.projectId}/topics/$topicId' { + _validateName(name); + } + + /// A topic with the given [name]. + /// + /// The [name] must be in the format `projects//topics/`. + /// Useful for cross-project access. + Topic(this.pubsub, this.name) { + _validateName(name); + } + + static void _validateName(String name) { + if (!_topicNameRegExp.hasMatch(name)) { + throw ArgumentError.value( + name, + 'name', + 'Must be in the format projects//topics/', + ); + } + } + + /// The ID of this topic. + String get topicId => name.split('/').last; + + /// Creates the given topic. + /// + /// Throws a [TopicAlreadyExistsException] if the topic already exists. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.CreateTopic). + Future create() => pubsub.createTopic(name); + + /// Deletes the topic. + /// + /// Returns `true` if the topic was deleted, or `false` if the topic did not + /// exist. + /// + /// After a topic is deleted, a new topic may be created with the same name; + /// this is an entirely new topic with none of the old configuration or + /// subscriptions. Existing subscriptions to this topic are not deleted, but + /// their `topic` field is set to `_deleted-topic_`. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.DeleteTopic). + Future delete() => pubsub.deleteTopic(name); + + /// Adds one or more messages to the topic. + /// + /// Throws a [TopicNotFoundException] if the topic does not exist. + /// + /// [data] is the message content. + /// [attributes] are optional attributes for the message. + /// + /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.Publish). + // TODO(sigurdm): Support batch publishing (publishMany) for high-throughput. + Future publish(List data, {Map? attributes}) => + pubsub.publish(name, data, attributes: attributes); +} diff --git a/pkgs/google_cloud_pubsub/pubspec.yaml b/pkgs/google_cloud_pubsub/pubspec.yaml index 084932c4..ac2c26f2 100644 --- a/pkgs/google_cloud_pubsub/pubspec.yaml +++ b/pkgs/google_cloud_pubsub/pubspec.yaml @@ -11,11 +11,18 @@ environment: resolution: workspace dependencies: + collection: ^1.19.1 + ffi: ^2.2.0 fixnum: ^1.1.1 + google_cloud: '>=0.3.0 <0.6.0' + google_cloud_protobuf: ^0.5.0 + google_cloud_rpc: ^0.5.0 + googleapis_auth: ^2.0.0 grpc: ^5.1.0 + http: ^1.6.0 + meta: ^1.18.1 protobuf: ^6.0.0 dev_dependencies: - http: ^1.6.0 protoc_plugin: ^25.0.0 test: ^1.24.0 diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart new file mode 100644 index 00000000..acfdf86b --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -0,0 +1,334 @@ +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'dart:convert'; +import 'dart:io'; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +void main() { + final isEmulator = Platform.environment['PUBSUB_EMULATOR_HOST'] != null; + + group('PubSub Integration', () { + PubSub? client; + + /// Pulls up to [count] messages from the [subscription], retrying up to 10 + /// times with a 1-second delay between attempts if the expected count is + /// not met. + /// + /// Because message delivery in Google Cloud Pub/Sub is eventually consistent, + /// a published message may not be immediately available in the first pull + /// request. Polling dynamically like this avoids both test flakiness (by + /// waiting up to 10 seconds) and unnecessary test suite delay (by returning + /// instantly as soon as all messages are retrieved). + Future> pullReliably( + Subscription subscription, { + required int count, + }) async { + final messages = []; + for (var i = 0; i < 10 && messages.length < count; i++) { + if (i > 0) { + await Future.delayed(const Duration(seconds: 1)); + } + final pulled = await subscription.pull( + maxMessages: count - messages.length, + ); + messages.addAll(pulled); + } + return messages; + } + + setUp(() async { + final host = Platform.environment['PUBSUB_EMULATOR_HOST']; + final project = Platform.environment['GOOGLE_CLOUD_PROJECT']; + + if (host != null) { + client = PubSub(projectId: 'test-project'); + } else if (project != null) { + client = PubSub( + projectId: project, + authenticator: await applicationDefaultCredentialsAuthenticator([ + 'https://www.googleapis.com/auth/pubsub', + ]), + ); + } else { + fail( + 'Neither PUBSUB_EMULATOR_HOST nor GOOGLE_CLOUD_PROJECT ' + 'environment variable set', + ); + } + }); + + tearDown(() async { + await client?.close(); + }); + + test('create topic and publish message', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + + // Create topic + await topic.create(); + addTearDown(() async => await topic.delete()); + + // Publish message + final messageId = await topic.publish(utf8.encode('Hello World')); + expect(messageId, isNotNull); + + // Delete topic + expect(await topic.delete(), isTrue); + }); + + test('Delete non-existent topic returns false', () async { + final topic = client!.topic( + 'non-existent-${DateTime.now().millisecondsSinceEpoch}', + ); + final deleted = await topic.delete(); + expect(deleted, isFalse); + }); + + test( + 'create existing topic throws TopicAlreadyExistsException', + () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + expect(topic.create(), throwsA(isA())); + + await topic.delete(); + }, + // Retry to handle occasional emulator race conditions where duplicate + // topic creation succeeds instead of throwing. + retry: isEmulator ? 3 : 0, + ); + + test( + 'create existing subscription throws SubscriptionAlreadyExistsException', + () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + expect( + () => subscription.create(topic: topic.name), + throwsA(isA()), + ); + + await subscription.delete(); + await topic.delete(); + }, + // Retry to handle occasional emulator race conditions where duplicate + // subscription creation succeeds instead of throwing. + retry: isEmulator ? 3 : 0, + ); + + test('create subscription for non-existent topic throws ' + 'TopicNotFoundException', () async { + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client!.subscription(subscriptionName); + + expect( + () => subscription.create( + topic: client!.topic('non-existent-topic').name, + ), + throwsA(isA()), + ); + }); + + test( + 'publish to non-existent topic throws TopicNotFoundException', + () async { + final topicName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + + expect( + () => topic.publish(utf8.encode('Hello')), + throwsA(isA()), + ); + }, + ); + + test('pull from non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client!.subscription(subscriptionName); + + expect(subscription.pull, throwsA(isA())); + }); + + test('acknowledge for non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client!.subscription(subscriptionName); + + expect( + () => subscription.acknowledge(['ack-id']), + throwsA(isA()), + ); + }); + + test('modifyAckDeadline for non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client!.subscription(subscriptionName); + + expect( + () => subscription.modifyAckDeadline(['ack-id'], 10), + throwsA(isA()), + ); + }); + + test('publish and pull message', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-' + '${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello PubSub'); + await topic.publish(data); + + // Pull message + final messages = await pullReliably(subscription, count: 1); + expect(messages, hasLength(1)); + expect(messages.first.data, equals(data)); + + // Ack message + await subscription.acknowledge([messages.first.ackId]); + }); + + test('publish and streaming pull message', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-' + '${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello Streaming PubSub'); + await topic.publish(data); + + // Start streaming pull + final stream = subscription.streamingPull(); + + // Use stream.first to get the first message and automatically cancel the + // stream. + final receivedMessage = await stream.first; + + expect(receivedMessage.data, equals(data)); + + // Ack message + await receivedMessage.ack(); + }); + + test('streaming pull throws StreamBrokenException ' + 'when subscription is deleted', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-' + '${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + + // Start streaming pull + final stream = subscription.streamingPull(); + + // Delete subscription to break the stream + await subscription.delete(); + + // Expect stream to throw StreamBrokenException + expect(stream.first, throwsA(isA())); + }); + + test('publish and pull message with attributes', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello PubSub with Attributes'); + final attributes = {'key1': 'value1', 'key2': 'value2'}; + await topic.publish(data, attributes: attributes); + + // Pull message + final messages = await pullReliably(subscription, count: 1); + expect(messages, hasLength(1)); + expect(messages.first.data, equals(data)); + expect(messages.first.attributes, equals(attributes)); + + // Ack message + await subscription.acknowledge([messages.first.ackId]); + }); + + test('publish multiple messages and pull batch', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client!.topic(topicName); + final subscription = client!.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + final data1 = utf8.encode('Message 1'); + final data2 = utf8.encode('Message 2'); + await topic.publish(data1); + await topic.publish(data2); + + // Pull messages + final messages = await pullReliably(subscription, count: 2); + expect(messages, hasLength(2)); + + final receivedData = messages.map((m) => m.data).toList(); + expect(receivedData, containsAll([data1, data2])); + + // Ack messages + await subscription.acknowledge(messages.map((m) => m.ackId).toList()); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/unit_test.dart b/pkgs/google_cloud_pubsub/test/unit_test.dart new file mode 100644 index 00000000..c388d620 --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/unit_test.dart @@ -0,0 +1,340 @@ +@TestOn('vm') +library; + +import 'dart:async'; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:google_cloud_pubsub/src/generated/google/pubsub/v1/pubsub.pb.dart' + as pb; +import 'package:google_cloud_pubsub/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart' + as generated; +import 'package:grpc/grpc.dart' as grpc; +import 'package:protobuf/well_known_types/google/protobuf/empty.pb.dart' + as protobuf; +import 'package:protobuf/well_known_types/google/protobuf/timestamp.pb.dart' + as pb_ts; +import 'package:test/test.dart'; + +// A fake ResponseFuture that delegates to a standard Future. +class FakeResponseFuture implements grpc.ResponseFuture { + final Future _future; + + FakeResponseFuture(this._future); + + @override + Stream asStream() => _future.asStream(); + + @override + Future catchError(Function onError, {bool Function(Object)? test}) => + _future.catchError(onError, test: test); + + @override + Future then( + FutureOr Function(T value) onValue, { + Function? onError, + }) => _future.then( + onValue, + onError: (Object e, StackTrace s) { + if (onError != null) { + if (onError is FutureOr Function(Object, StackTrace)) { + onError(e, s); + } else if (onError is FutureOr Function(Object)) { + onError(e); + } else { + // ignore: avoid_dynamic_calls + (onError as dynamic)(e, s); + } + } + }, + ); + + @override + Future timeout(Duration timeLimit, {FutureOr Function()? onTimeout}) => + _future.timeout(timeLimit, onTimeout: onTimeout); + + @override + Future whenComplete(FutureOr Function() action) => + _future.whenComplete(action); + + @override + dynamic noSuchMethod(Invocation invocation) { + if (invocation.memberName == #cancel) { + return Future.value(); + } + return super.noSuchMethod(invocation); + } +} + +// A fake ResponseStream that delegates to a standard Stream. +class FakeResponseStream extends Stream + implements grpc.ResponseStream { + final Stream _stream; + + FakeResponseStream(this._stream); + + @override + StreamSubscription listen( + void Function(T event)? onData, { + Function? onError, + void Function()? onDone, + bool? cancelOnError, + }) => _stream.listen( + onData, + onError: (Object e, StackTrace s) { + if (onError != null) { + if (onError is void Function(Object, StackTrace)) { + onError(e, s); + } else if (onError is void Function(Object)) { + onError(e); + } else { + // ignore: avoid_dynamic_calls + (onError as dynamic)(e, s); + } + } + }, + onDone: onDone, + cancelOnError: cancelOnError, + ); + + @override + grpc.ResponseFuture get single => FakeResponseFuture(_stream.single); + + @override + dynamic noSuchMethod(Invocation invocation) { + if (invocation.memberName == #cancel) { + return Future.value(); + } + return super.noSuchMethod(invocation); + } +} + +class FakeSubscriberClient implements generated.SubscriberClient { + final StreamController + streamingPullController = StreamController(); + + bool acknowledgeCalled = false; + List? lastAckIds; + Future Function(List ackIds)? acknowledgeBehavior; + + bool modifyAckDeadlineCalled = false; + List? lastModifyAckDeadlineIds; + int? lastModifyAckDeadlineSeconds; + Future Function(List ackIds, int seconds)? + modifyAckDeadlineBehavior; + + @override + grpc.ResponseStream streamingPull( + Stream request, { + grpc.CallOptions? options, + }) { + // Listen to request stream to prevent sender from hanging on close() + request.listen((_) {}, onDone: () {}); + return FakeResponseStream(streamingPullController.stream); + } + + @override + grpc.ResponseFuture acknowledge( + generated.AcknowledgeRequest request, { + grpc.CallOptions? options, + }) { + acknowledgeCalled = true; + lastAckIds = request.ackIds; + + final completer = Completer(); + if (acknowledgeBehavior != null) { + acknowledgeBehavior!(request.ackIds) + .then((_) => completer.complete(protobuf.Empty())) + .catchError(completer.completeError); + } else { + completer.complete(protobuf.Empty()); + } + return FakeResponseFuture(completer.future); + } + + @override + grpc.ResponseFuture modifyAckDeadline( + generated.ModifyAckDeadlineRequest request, { + grpc.CallOptions? options, + }) { + modifyAckDeadlineCalled = true; + lastModifyAckDeadlineIds = request.ackIds; + lastModifyAckDeadlineSeconds = request.ackDeadlineSeconds; + + final completer = Completer(); + if (modifyAckDeadlineBehavior != null) { + modifyAckDeadlineBehavior!(request.ackIds, request.ackDeadlineSeconds) + .then((_) => completer.complete(protobuf.Empty())) + .catchError(completer.completeError); + } else { + completer.complete(protobuf.Empty()); + } + return FakeResponseFuture(completer.future); + } + + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class FakeClientChannel implements grpc.ClientChannel { + @override + Future shutdown() async { + // No-op for testing + } + + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +void main() { + group('PubSub Unit Tests (Error Propagation)', () { + late FakeSubscriberClient fakeSubscriber; + late PubSub client; + + setUp(() { + fakeSubscriber = FakeSubscriberClient(); + client = PubSub.testing( + projectId: 'test-project', + channel: FakeClientChannel(), + subscriberClient: fakeSubscriber, + ); + }); + + tearDown(() async { + await client.close(); + }); + + test('streamingPull ack error propagates', () async { + final stream = client.subscription('sub').streamingPull(); + + // Configure acknowledge to fail + fakeSubscriber.acknowledgeBehavior = (ackIds) async { + throw const grpc.GrpcError.notFound('Subscription not found'); + }; + + // Push a fake message to the stream + Timer(const Duration(milliseconds: 10), () { + final fakeResponse = generated.StreamingPullResponse() + ..receivedMessages.add( + generated.ReceivedMessage() + ..ackId = 'ack-1' + ..message = (pb.PubsubMessage()..messageId = 'msg-1'), + ); + fakeSubscriber.streamingPullController.add(fakeResponse); + }); + + final receivedMessage = await stream.first; + expect(receivedMessage.ackId, equals('ack-1')); + + final ackFuture = receivedMessage.ack(); + + await expectLater( + ackFuture, + throwsA( + isA().having( + (e) => e.name, + 'name', + 'projects/test-project/subscriptions/sub', + ), + ), + ); + + expect(fakeSubscriber.acknowledgeCalled, isTrue); + expect(fakeSubscriber.lastAckIds, equals(['ack-1'])); + }); + + test('streamingPull modifyAckDeadline error propagates', () async { + final stream = client.subscription('sub').streamingPull(); + + // Configure modifyAckDeadline to fail + fakeSubscriber.modifyAckDeadlineBehavior = (ackIds, seconds) async { + throw const grpc.GrpcError.notFound('Subscription not found'); + }; + + // Push a fake message to the stream + Timer(const Duration(milliseconds: 10), () { + final fakeResponse = generated.StreamingPullResponse() + ..receivedMessages.add( + generated.ReceivedMessage() + ..ackId = 'ack-2' + ..message = (pb.PubsubMessage()..messageId = 'msg-2'), + ); + fakeSubscriber.streamingPullController.add(fakeResponse); + }); + + final receivedMessage = await stream.first; + expect(receivedMessage.ackId, equals('ack-2')); + + final modifyDeadlineFuture = receivedMessage.modifyAckDeadline(10); + + await expectLater( + modifyDeadlineFuture, + throwsA( + isA().having( + (e) => e.name, + 'name', + 'projects/test-project/subscriptions/sub', + ), + ), + ); + + expect(fakeSubscriber.modifyAckDeadlineCalled, isTrue); + expect(fakeSubscriber.lastModifyAckDeadlineIds, equals(['ack-2'])); + expect(fakeSubscriber.lastModifyAckDeadlineSeconds, equals(10)); + }); + + test('message mapping works correctly', () async { + final stream = client.subscription('sub').streamingPull(); + + final publishTime = DateTime.utc(2026, 6, 9, 12, 0, 0); + + Timer(const Duration(milliseconds: 10), () { + final fakeResponse = generated.StreamingPullResponse() + ..receivedMessages.add( + generated.ReceivedMessage() + ..ackId = 'ack-1' + ..message = (pb.PubsubMessage() + ..messageId = 'msg-1' + ..publishTime = pb_ts.Timestamp.fromDateTime(publishTime) + ..data = [1, 2, 3] + ..attributes.addAll({'key': 'value'})), + ); + fakeSubscriber.streamingPullController.add(fakeResponse); + }); + + final receivedMessage = await stream.first; + expect(receivedMessage.ackId, equals('ack-1')); + expect(receivedMessage.messageId, equals('msg-1')); + expect(receivedMessage.publishTime, equals(publishTime)); + + // Test delegation + expect(receivedMessage.data, equals([1, 2, 3])); + expect(receivedMessage.attributes, equals({'key': 'value'})); + + // Test message composition + expect(receivedMessage.message.data, equals([1, 2, 3])); + expect(receivedMessage.message.attributes, equals({'key': 'value'})); + }); + }); + + group('ReceivedMessage composition and delegation', () { + test('properties are correctly mapped and delegated', () { + final publishTime = DateTime.now(); + final message = Message(data: [1, 2, 3], attributes: {'key': 'value'}); + final receivedMessage = ReceivedMessage( + ackId: 'ack-123', + messageId: 'msg-456', + publishTime: publishTime, + message: message, + ); + + expect(receivedMessage.ackId, equals('ack-123')); + expect(receivedMessage.messageId, equals('msg-456')); + expect(receivedMessage.publishTime, equals(publishTime)); + expect(receivedMessage.message, equals(message)); + + // Delegation getters + expect(receivedMessage.data, equals([1, 2, 3])); + expect(receivedMessage.attributes, equals({'key': 'value'})); + }); + }); +} From e52b4eb525f30ea637b36dc66e566688ee468246 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Fri, 19 Jun 2026 08:40:23 +0000 Subject: [PATCH 12/18] refactor(pubsub): hide ReceivedMessage constructor from public API - Make ReceivedMessage constructor private (ReceivedMessage._). - Introduce package-private createReceivedMessage helper annotated with @internal. - Update client.dart and unit_test.dart to use the helper. TAG=agy CONV=06ddc172-e8da-4e30-bab8-139c539520f9 --- pkgs/google_cloud_pubsub/lib/src/client.dart | 3 ++- pkgs/google_cloud_pubsub/lib/src/message.dart | 23 ++++++++++++++++++- pkgs/google_cloud_pubsub/test/unit_test.dart | 4 +++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index 0323bfd6..62aa1feb 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -18,6 +18,7 @@ import 'package:grpc/grpc.dart'; import 'package:meta/meta.dart'; import '../google_cloud_pubsub.dart'; import 'generated/google/pubsub/v1/pubsub.pbgrpc.dart' as grpc; +import 'message.dart' show createReceivedMessage; import 'pubsub_emulator_host_vm.dart'; import 'subscription.dart' show newSubscription, newSubscriptionName; import 'topic.dart' show newTopic, newTopicName; @@ -103,7 +104,7 @@ final class PubSub { FutureOr Function(List ackIds)? ackHandler, FutureOr Function(List ackIds, int seconds)? modifyDeadlineHandler, - }) => ReceivedMessage( + }) => createReceivedMessage( ackId: m.ackId, messageId: m.message.messageId, publishTime: m.message.publishTime.toDateTime(), diff --git a/pkgs/google_cloud_pubsub/lib/src/message.dart b/pkgs/google_cloud_pubsub/lib/src/message.dart index 1ee83e16..99c565a8 100644 --- a/pkgs/google_cloud_pubsub/lib/src/message.dart +++ b/pkgs/google_cloud_pubsub/lib/src/message.dart @@ -16,6 +16,8 @@ import 'dart:async'; import 'dart:typed_data'; +import 'package:meta/meta.dart'; + import 'exceptions.dart'; import 'subscription.dart'; @@ -50,7 +52,7 @@ final class ReceivedMessage { final FutureOr Function(List ackIds, int seconds)? _modifyDeadlineHandler; - ReceivedMessage({ + ReceivedMessage._({ required this.ackId, required this.messageId, required this.publishTime, @@ -108,3 +110,22 @@ final class ReceivedMessage { } } } + +/// Creates a [ReceivedMessage] for internal use. +@internal +ReceivedMessage createReceivedMessage({ + required String ackId, + required String messageId, + required DateTime publishTime, + required Message message, + FutureOr Function(List ackIds)? ackHandler, + FutureOr Function(List ackIds, int seconds)? + modifyDeadlineHandler, +}) => ReceivedMessage._( + ackId: ackId, + messageId: messageId, + publishTime: publishTime, + message: message, + ackHandler: ackHandler, + modifyDeadlineHandler: modifyDeadlineHandler, +); diff --git a/pkgs/google_cloud_pubsub/test/unit_test.dart b/pkgs/google_cloud_pubsub/test/unit_test.dart index c388d620..397b7463 100644 --- a/pkgs/google_cloud_pubsub/test/unit_test.dart +++ b/pkgs/google_cloud_pubsub/test/unit_test.dart @@ -8,6 +8,8 @@ import 'package:google_cloud_pubsub/src/generated/google/pubsub/v1/pubsub.pb.dar as pb; import 'package:google_cloud_pubsub/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart' as generated; +import 'package:google_cloud_pubsub/src/message.dart' + show createReceivedMessage; import 'package:grpc/grpc.dart' as grpc; import 'package:protobuf/well_known_types/google/protobuf/empty.pb.dart' as protobuf; @@ -320,7 +322,7 @@ void main() { test('properties are correctly mapped and delegated', () { final publishTime = DateTime.now(); final message = Message(data: [1, 2, 3], attributes: {'key': 'value'}); - final receivedMessage = ReceivedMessage( + final receivedMessage = createReceivedMessage( ackId: 'ack-123', messageId: 'msg-456', publishTime: publishTime, From bc36dd730e38dcbd13d485d9112ea232a460dd20 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Fri, 19 Jun 2026 09:10:04 +0000 Subject: [PATCH 13/18] refactor(pubsub): make ReceivedMessage a pure data class Simplify ReceivedMessage by removing ack() and modifyAckDeadline() methods, which removes the need for storing internal callback handlers. - Make ReceivedMessage constructor public and simple. - Update client.dart to map ReceivedMessage without callbacks. - Update unit tests and integration tests to use Subscription.acknowledge() and Subscription.modifyAckDeadline() instead of message methods. - Fix linter warning in client.dart (use tearoff). TAG=agy CONV=06ddc172-e8da-4e30-bab8-139c539520f9 --- pkgs/google_cloud_pubsub/lib/src/client.dart | 45 +++-------- pkgs/google_cloud_pubsub/lib/src/message.dart | 79 +------------------ .../test/integration_test.dart | 2 +- pkgs/google_cloud_pubsub/test/unit_test.dart | 16 ++-- 4 files changed, 24 insertions(+), 118 deletions(-) diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index 62aa1feb..57ac3c3c 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -18,7 +18,6 @@ import 'package:grpc/grpc.dart'; import 'package:meta/meta.dart'; import '../google_cloud_pubsub.dart'; import 'generated/google/pubsub/v1/pubsub.pbgrpc.dart' as grpc; -import 'message.dart' show createReceivedMessage; import 'pubsub_emulator_host_vm.dart'; import 'subscription.dart' show newSubscription, newSubscriptionName; import 'topic.dart' show newTopic, newTopicName; @@ -99,19 +98,16 @@ final class PubSub { /// Turns the protobuf-generated [grpc.ReceivedMessage] into a /// [ReceivedMessage]. - static ReceivedMessage _mapReceivedMessage( - grpc.ReceivedMessage m, { - FutureOr Function(List ackIds)? ackHandler, - FutureOr Function(List ackIds, int seconds)? - modifyDeadlineHandler, - }) => createReceivedMessage( - ackId: m.ackId, - messageId: m.message.messageId, - publishTime: m.message.publishTime.toDateTime(), - message: Message(data: m.message.data, attributes: m.message.attributes), - ackHandler: ackHandler, - modifyDeadlineHandler: modifyDeadlineHandler, - ); + static ReceivedMessage _mapReceivedMessage(grpc.ReceivedMessage m) => + ReceivedMessage( + ackId: m.ackId, + messageId: m.message.messageId, + publishTime: m.message.publishTime.toDateTime(), + message: Message( + data: m.message.data, + attributes: m.message.attributes, + ), + ); /// Constructs a client used to communicate with [Google Cloud Pub/Sub][]. /// @@ -393,16 +389,7 @@ final class PubSub { options: await _callOptions, ); - return response.receivedMessages - .map( - (m) => _mapReceivedMessage( - m, - ackHandler: (ackIds) => acknowledge(name, ackIds), - modifyDeadlineHandler: (ackIds, seconds) => - modifyAckDeadline(name, ackIds, seconds), - ), - ) - .toList(); + return response.receivedMessages.map(_mapReceivedMessage).toList(); } on GrpcError catch (e) { if (e.code == StatusCode.notFound) { throw SubscriptionNotFoundException(name); @@ -451,15 +438,7 @@ final class PubSub { ); await for (final response in responseStream) { for (final m in response.receivedMessages) { - yield _mapReceivedMessage( - m, - // NOTE: Using unary RPCs for acks and deadline modifications - // - // TODO(sigurdm): implement ack/deadline pipelining. - ackHandler: (ackIds) => acknowledge(name, ackIds), - modifyDeadlineHandler: (ackIds, seconds) => - modifyAckDeadline(name, ackIds, seconds), - ); + yield _mapReceivedMessage(m); } } } on GrpcError catch (e) { diff --git a/pkgs/google_cloud_pubsub/lib/src/message.dart b/pkgs/google_cloud_pubsub/lib/src/message.dart index 99c565a8..2c710fff 100644 --- a/pkgs/google_cloud_pubsub/lib/src/message.dart +++ b/pkgs/google_cloud_pubsub/lib/src/message.dart @@ -12,15 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import 'dart:async'; - import 'dart:typed_data'; -import 'package:meta/meta.dart'; - -import 'exceptions.dart'; -import 'subscription.dart'; - /// A Pub/Sub message. final class Message { /// The message data. @@ -48,84 +41,16 @@ final class ReceivedMessage { /// The time at which the message was published. final DateTime publishTime; - final FutureOr Function(List ackIds)? _ackHandler; - final FutureOr Function(List ackIds, int seconds)? - _modifyDeadlineHandler; - - ReceivedMessage._({ + ReceivedMessage({ required this.ackId, required this.messageId, required this.publishTime, required this.message, - FutureOr Function(List ackIds)? ackHandler, - FutureOr Function(List ackIds, int seconds)? - modifyDeadlineHandler, - }) : _ackHandler = ackHandler, - _modifyDeadlineHandler = modifyDeadlineHandler; + }); /// The message data. Uint8List get data => message.data; /// Optional attributes for this message. Map get attributes => message.attributes; - - /// Acknowledges the message. - /// - /// If this message was received via [Subscription.pull], it will call - /// [Subscription.acknowledge]. - /// If it was received via [Subscription.streamingPull], it will send an - /// acknowledgment request over the existing stream. - /// - /// Throws a [PubSubException] if the acknowledgment fails (for example, if - /// the subscription does not exist or there is a network error). - Future ack() async { - final handler = _ackHandler; - if (handler != null) { - await handler([ackId]); - } - } - - /// Modifies the ack deadline for this message. - /// - /// [seconds] must be the new ack deadline in seconds, relative to the - /// time this method is called. For example, if [seconds] is 10, the new ack - /// deadline is 10 seconds from now. Specifying 0 makes the message - /// immediately available for redelivery. - /// - /// If this message was received via [Subscription.pull], it will call - /// [Subscription.modifyAckDeadline]. - /// If it was received via [Subscription.streamingPull], it will send a - /// modification request over the existing stream. - /// - /// Modifying the ack deadline for a message whose deadline has already - /// expired may succeed, but the message may have already been redelivered - /// or made available for redelivery. - /// - /// Throws a [PubSubException] if the modification fails (for example, if the - /// subscription does not exist or there is a network error). - Future modifyAckDeadline(int seconds) async { - final handler = _modifyDeadlineHandler; - if (handler != null) { - await handler([ackId], seconds); - } - } } - -/// Creates a [ReceivedMessage] for internal use. -@internal -ReceivedMessage createReceivedMessage({ - required String ackId, - required String messageId, - required DateTime publishTime, - required Message message, - FutureOr Function(List ackIds)? ackHandler, - FutureOr Function(List ackIds, int seconds)? - modifyDeadlineHandler, -}) => ReceivedMessage._( - ackId: ackId, - messageId: messageId, - publishTime: publishTime, - message: message, - ackHandler: ackHandler, - modifyDeadlineHandler: modifyDeadlineHandler, -); diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart index acfdf86b..1a9f1508 100644 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -248,7 +248,7 @@ void main() { expect(receivedMessage.data, equals(data)); // Ack message - await receivedMessage.ack(); + await subscription.acknowledge([receivedMessage.ackId]); }); test('streaming pull throws StreamBrokenException ' diff --git a/pkgs/google_cloud_pubsub/test/unit_test.dart b/pkgs/google_cloud_pubsub/test/unit_test.dart index 397b7463..45868d66 100644 --- a/pkgs/google_cloud_pubsub/test/unit_test.dart +++ b/pkgs/google_cloud_pubsub/test/unit_test.dart @@ -8,8 +8,6 @@ import 'package:google_cloud_pubsub/src/generated/google/pubsub/v1/pubsub.pb.dar as pb; import 'package:google_cloud_pubsub/src/generated/google/pubsub/v1/pubsub.pbgrpc.dart' as generated; -import 'package:google_cloud_pubsub/src/message.dart' - show createReceivedMessage; import 'package:grpc/grpc.dart' as grpc; import 'package:protobuf/well_known_types/google/protobuf/empty.pb.dart' as protobuf; @@ -206,7 +204,8 @@ void main() { }); test('streamingPull ack error propagates', () async { - final stream = client.subscription('sub').streamingPull(); + final subscription = client.subscription('sub'); + final stream = subscription.streamingPull(); // Configure acknowledge to fail fakeSubscriber.acknowledgeBehavior = (ackIds) async { @@ -227,7 +226,7 @@ void main() { final receivedMessage = await stream.first; expect(receivedMessage.ackId, equals('ack-1')); - final ackFuture = receivedMessage.ack(); + final ackFuture = subscription.acknowledge([receivedMessage.ackId]); await expectLater( ackFuture, @@ -245,7 +244,8 @@ void main() { }); test('streamingPull modifyAckDeadline error propagates', () async { - final stream = client.subscription('sub').streamingPull(); + final subscription = client.subscription('sub'); + final stream = subscription.streamingPull(); // Configure modifyAckDeadline to fail fakeSubscriber.modifyAckDeadlineBehavior = (ackIds, seconds) async { @@ -266,7 +266,9 @@ void main() { final receivedMessage = await stream.first; expect(receivedMessage.ackId, equals('ack-2')); - final modifyDeadlineFuture = receivedMessage.modifyAckDeadline(10); + final modifyDeadlineFuture = subscription.modifyAckDeadline([ + receivedMessage.ackId, + ], 10); await expectLater( modifyDeadlineFuture, @@ -322,7 +324,7 @@ void main() { test('properties are correctly mapped and delegated', () { final publishTime = DateTime.now(); final message = Message(data: [1, 2, 3], attributes: {'key': 'value'}); - final receivedMessage = createReceivedMessage( + final receivedMessage = ReceivedMessage( ackId: 'ack-123', messageId: 'msg-456', publishTime: publishTime, From 14686281480290200f82669ac7915b354383c734 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Fri, 19 Jun 2026 10:15:38 +0000 Subject: [PATCH 14/18] docs(pubsub): document project ID fallback for emulator Add inline comment to _calculateProjectId explaining that we only fall back to 'test-project' when the emulator is active. TAG=agy CONV=06ddc172-e8da-4e30-bab8-139c539520f9 --- pkgs/google_cloud_pubsub/lib/src/client.dart | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index 57ac3c3c..f517403d 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -34,12 +34,16 @@ final class PubSub { grpc.SubscriberClient? _subscriberClient; final BaseAuthenticator? _authenticator; - static String? _calculateProjectId(String? projectId, String? emulatorHost) => - switch ((projectId, emulatorHost)) { - (final String projectId, _) => projectId, - (null, _?) => projectFromEnvironment ?? 'test-project', - (null, null) => projectFromEnvironment, - }; + static String? _calculateProjectId( + String? projectId, + String? emulatorHost, + ) => switch ((projectId, emulatorHost)) { + (final String projectId, _) => projectId, + // When the emulator is active (emulatorHost is not null), we fall back + // to 'test-project' if GOOGLE_CLOUD_PROJECT is not set in the environment. + (null, _?) => projectFromEnvironment ?? 'test-project', + (null, null) => projectFromEnvironment, + }; static ClientChannel _calculateChannel( String? apiEndpoint, From fe7ba0b3c4f9b0ac6e6a4bea048ce836556e3c46 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Mon, 22 Jun 2026 10:25:58 +0000 Subject: [PATCH 15/18] chore(pubsub): add missing copyright headers to existing files --- .../google_cloud_pubsub/test/integration_test.dart | 14 ++++++++++++++ pkgs/google_cloud_pubsub/test/unit_test.dart | 14 ++++++++++++++ pkgs/google_cloud_pubsub/tool/compile_protos.dart | 14 ++++++++++++++ pkgs/google_cloud_pubsub/tool/fetch_protos.dart | 14 ++++++++++++++ 4 files changed, 56 insertions(+) diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart index 1a9f1508..9d959786 100644 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -1,3 +1,17 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + @TestOn('vm') @Tags(['firebase-emulator']) library; diff --git a/pkgs/google_cloud_pubsub/test/unit_test.dart b/pkgs/google_cloud_pubsub/test/unit_test.dart index 45868d66..b76547e4 100644 --- a/pkgs/google_cloud_pubsub/test/unit_test.dart +++ b/pkgs/google_cloud_pubsub/test/unit_test.dart @@ -1,3 +1,17 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + @TestOn('vm') library; diff --git a/pkgs/google_cloud_pubsub/tool/compile_protos.dart b/pkgs/google_cloud_pubsub/tool/compile_protos.dart index 1ab28204..65fe73b6 100644 --- a/pkgs/google_cloud_pubsub/tool/compile_protos.dart +++ b/pkgs/google_cloud_pubsub/tool/compile_protos.dart @@ -1,3 +1,17 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import 'dart:io'; void main() async { diff --git a/pkgs/google_cloud_pubsub/tool/fetch_protos.dart b/pkgs/google_cloud_pubsub/tool/fetch_protos.dart index df037544..a7e3abe8 100644 --- a/pkgs/google_cloud_pubsub/tool/fetch_protos.dart +++ b/pkgs/google_cloud_pubsub/tool/fetch_protos.dart @@ -1,3 +1,17 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import 'dart:io'; import 'package:http/http.dart' as http; From f2b99f467d70eb47f7bebffd677dc20fb921bfb3 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Mon, 22 Jun 2026 10:28:47 +0000 Subject: [PATCH 16/18] refactor(pubsub): align acknowledge and modifyAckDeadline signatures with latest API design - Changed acknowledge and modifyAckDeadline to take ReceivedMessage and return void (fire-and-forget). - Added acknowledgeNow and modifyAckDeadlineNow to support immediate, awaitable operations on List. - Updated tests and examples accordingly. TAG=agy CONV=bc7c6164-e9cb-4a0f-b326-7752c814e1ce --- .../lib/src/subscription.dart | 46 ++++++++++++++++--- .../test/integration_test.dart | 26 ++++++++--- pkgs/google_cloud_pubsub/test/unit_test.dart | 6 +-- 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/pkgs/google_cloud_pubsub/lib/src/subscription.dart b/pkgs/google_cloud_pubsub/lib/src/subscription.dart index cd483bca..d8db02b3 100644 --- a/pkgs/google_cloud_pubsub/lib/src/subscription.dart +++ b/pkgs/google_cloud_pubsub/lib/src/subscription.dart @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +import 'dart:async'; + import 'package:meta/meta.dart'; import '../google_cloud_pubsub.dart'; @@ -132,7 +134,7 @@ final class Subscription { ); } - /// Acknowledges the messages associated with the `ack_ids`. + /// Acknowledges the messages associated with the [messages] immediately. /// /// The Pub/Sub system can remove the relevant messages from the subscription. /// @@ -144,10 +146,19 @@ final class Subscription { /// exist. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Acknowledge). - Future acknowledge(List ackIds) => - pubsub.acknowledge(name, ackIds); + Future acknowledgeNow(List messages) => + pubsub.acknowledge(name, messages.map((m) => m.ackId).toList()); + + /// Acknowledges a single message in the background. + /// + /// This operation is "fire-and-forget" and does not wait for server + /// confirmation. If you require explicit confirmation of acknowledgment, + /// use [acknowledgeNow]. + void acknowledge(ReceivedMessage message) { + unawaited(acknowledgeNow([message])); + } - /// Modifies the ack deadline for a list of specific messages. + /// Modifies the ack deadline for a list of specific messages immediately. /// /// This method is useful to indicate that more time is needed to process a /// message by the subscriber, or to make the message available for redelivery @@ -162,7 +173,30 @@ final class Subscription { /// exist. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.ModifyAckDeadline). - Future modifyAckDeadline(List ackIds, int ackDeadlineSeconds) { + Future modifyAckDeadlineNow( + List messages, + int ackDeadlineSeconds, + ) { + if (ackDeadlineSeconds < 0) { + throw ArgumentError.value( + ackDeadlineSeconds, + 'ackDeadlineSeconds', + 'Must be non-negative', + ); + } + return pubsub.modifyAckDeadline( + name, + messages.map((m) => m.ackId).toList(), + ackDeadlineSeconds, + ); + } + + /// Modifies the ack deadline for a single message in the background. + /// + /// This operation is "fire-and-forget" and does not wait for server + /// confirmation. If you require explicit confirmation, use + /// [modifyAckDeadlineNow]. + void modifyAckDeadline(ReceivedMessage message, int ackDeadlineSeconds) { if (ackDeadlineSeconds < 0) { throw ArgumentError.value( ackDeadlineSeconds, @@ -170,6 +204,6 @@ final class Subscription { 'Must be non-negative', ); } - return pubsub.modifyAckDeadline(name, ackIds, ackDeadlineSeconds); + unawaited(modifyAckDeadlineNow([message], ackDeadlineSeconds)); } } diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart index 9d959786..528bd7ea 100644 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ b/pkgs/google_cloud_pubsub/test/integration_test.dart @@ -192,7 +192,14 @@ void main() { final subscription = client!.subscription(subscriptionName); expect( - () => subscription.acknowledge(['ack-id']), + () => subscription.acknowledgeNow([ + ReceivedMessage( + ackId: 'ack-id', + messageId: 'msg-id', + publishTime: DateTime.now(), + message: Message(data: []), + ), + ]), throwsA(isA()), ); }); @@ -204,7 +211,14 @@ void main() { final subscription = client!.subscription(subscriptionName); expect( - () => subscription.modifyAckDeadline(['ack-id'], 10), + () => subscription.modifyAckDeadlineNow([ + ReceivedMessage( + ackId: 'ack-id', + messageId: 'msg-id', + publishTime: DateTime.now(), + message: Message(data: []), + ), + ], 10), throwsA(isA()), ); }); @@ -232,7 +246,7 @@ void main() { expect(messages.first.data, equals(data)); // Ack message - await subscription.acknowledge([messages.first.ackId]); + await subscription.acknowledgeNow([messages.first]); }); test('publish and streaming pull message', () async { @@ -262,7 +276,7 @@ void main() { expect(receivedMessage.data, equals(data)); // Ack message - await subscription.acknowledge([receivedMessage.ackId]); + await subscription.acknowledgeNow([receivedMessage]); }); test('streaming pull throws StreamBrokenException ' @@ -313,7 +327,7 @@ void main() { expect(messages.first.attributes, equals(attributes)); // Ack message - await subscription.acknowledge([messages.first.ackId]); + await subscription.acknowledgeNow([messages.first]); }); test('publish multiple messages and pull batch', () async { @@ -342,7 +356,7 @@ void main() { expect(receivedData, containsAll([data1, data2])); // Ack messages - await subscription.acknowledge(messages.map((m) => m.ackId).toList()); + await subscription.acknowledgeNow(messages); }); }); } diff --git a/pkgs/google_cloud_pubsub/test/unit_test.dart b/pkgs/google_cloud_pubsub/test/unit_test.dart index b76547e4..764d995f 100644 --- a/pkgs/google_cloud_pubsub/test/unit_test.dart +++ b/pkgs/google_cloud_pubsub/test/unit_test.dart @@ -240,7 +240,7 @@ void main() { final receivedMessage = await stream.first; expect(receivedMessage.ackId, equals('ack-1')); - final ackFuture = subscription.acknowledge([receivedMessage.ackId]); + final ackFuture = subscription.acknowledgeNow([receivedMessage]); await expectLater( ackFuture, @@ -280,8 +280,8 @@ void main() { final receivedMessage = await stream.first; expect(receivedMessage.ackId, equals('ack-2')); - final modifyDeadlineFuture = subscription.modifyAckDeadline([ - receivedMessage.ackId, + final modifyDeadlineFuture = subscription.modifyAckDeadlineNow([ + receivedMessage, ], 10); await expectLater( From d4cf8f8e11b45b64186a9c9917fa3808d154be9f Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Thu, 25 Jun 2026 13:33:05 +0000 Subject: [PATCH 17/18] fix(pubsub): address review comments on PR 244 - Fix finalSize check in Windows environment variable reader to handle errors/race conditions. - Update documentation to follow style guidelines for programmer errors (use "It is an error if..." instead of "Throws..."). TAG=agy CONV=ad5bf873-d53c-4338-9b86-1b6a21376d4d --- pkgs/google_cloud_pubsub/lib/src/client.dart | 2 +- .../lib/src/pubsub_emulator_host_vm.dart | 4 +--- pkgs/google_cloud_pubsub/lib/src/subscription.dart | 14 ++++++++++++-- pkgs/google_cloud_pubsub/lib/src/topic.dart | 7 ++++++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index f517403d..e42afcca 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -123,7 +123,7 @@ final class PubSub { /// 2. If the `PUBSUB_EMULATOR_HOST` environment variable is set (indicating /// the emulator is active), it defaults to `'test-project'`. /// - /// Throws if [projectId] is not provided and cannot be + /// It is an error if [projectId] is not provided and cannot be /// inferred from the environment. /// /// For authentication, an [authenticator] can be supplied to obtain diff --git a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart index 893448ff..f0e12957 100644 --- a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart +++ b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart @@ -50,9 +50,7 @@ String? _windowsEnvironmentVariable(String name) => using((arena) { final buffer = arena(size).cast(); final finalSize = _getEnvironmentVariableW(namePtr, buffer, size); - if (finalSize == 0 && size > 1) { - // If it failed the second time, but size was > 1 (meaning it existed and - // wasn't empty), then something went wrong. + if (finalSize == 0 || finalSize >= size) { return null; } // finalSize is the number of characters stored, NOT including null. diff --git a/pkgs/google_cloud_pubsub/lib/src/subscription.dart b/pkgs/google_cloud_pubsub/lib/src/subscription.dart index d8db02b3..081183c7 100644 --- a/pkgs/google_cloud_pubsub/lib/src/subscription.dart +++ b/pkgs/google_cloud_pubsub/lib/src/subscription.dart @@ -41,6 +41,9 @@ final class Subscription { final String name; /// A subscription with the given [subscriptionId] in the client's project. + /// + /// It is an error if the constructed subscription name is invalid (e.g. if + /// [subscriptionId] contains slashes). Subscription.unqualified(this.pubsub, String subscriptionId) : name = 'projects/${pubsub.projectId}/subscriptions/$subscriptionId' { _validateName(name); @@ -48,9 +51,10 @@ final class Subscription { /// A subscription with the given [name]. /// - /// The [name] must be in the format - /// `projects//subscriptions/`. /// Useful for cross-project access. + /// + /// It is an error if [name] is not in the format + /// `projects//subscriptions/`. Subscription(this.pubsub, this.name) { _validateName(name); } @@ -94,6 +98,8 @@ final class Subscription { /// Throws a [SubscriptionNotFoundException] if the subscription does not /// exist. /// + /// It is an error if [maxMessages] is less than or equal to 0. + /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Pull). Future> pull({int maxMessages = 1}) { if (maxMessages <= 0) { @@ -172,6 +178,8 @@ final class Subscription { /// Throws a [SubscriptionNotFoundException] if the subscription does not /// exist. /// + /// It is an error if [ackDeadlineSeconds] is negative. + /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.ModifyAckDeadline). Future modifyAckDeadlineNow( List messages, @@ -196,6 +204,8 @@ final class Subscription { /// This operation is "fire-and-forget" and does not wait for server /// confirmation. If you require explicit confirmation, use /// [modifyAckDeadlineNow]. + /// + /// It is an error if [ackDeadlineSeconds] is negative. void modifyAckDeadline(ReceivedMessage message, int ackDeadlineSeconds) { if (ackDeadlineSeconds < 0) { throw ArgumentError.value( diff --git a/pkgs/google_cloud_pubsub/lib/src/topic.dart b/pkgs/google_cloud_pubsub/lib/src/topic.dart index 0c18fd24..0452ede0 100644 --- a/pkgs/google_cloud_pubsub/lib/src/topic.dart +++ b/pkgs/google_cloud_pubsub/lib/src/topic.dart @@ -38,6 +38,9 @@ final class Topic { final String name; /// A topic with the given [topicId] in the client's project. + /// + /// It is an error if the constructed topic name is invalid (e.g. if [topicId] + /// contains slashes). Topic.unqualified(this.pubsub, String topicId) : name = 'projects/${pubsub.projectId}/topics/$topicId' { _validateName(name); @@ -45,8 +48,10 @@ final class Topic { /// A topic with the given [name]. /// - /// The [name] must be in the format `projects//topics/`. /// Useful for cross-project access. + /// + /// It is an error if [name] is not in the format + /// `projects//topics/`. Topic(this.pubsub, this.name) { _validateName(name); } From b665761930b6ec541ed53e2f9899f19c9234e658 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Thu, 2 Jul 2026 11:35:59 +0000 Subject: [PATCH 18/18] Address review comments on PR #244 - Default to ADC when not using emulator - Default emulator project ID to test-project - Parse emulator host as Uri? with validation - Update deleteTopic and deleteSubscription to throw on notFound - Rename name parameter to topic/subscription in PubSub client methods - Centralize GrpcError mapping - Rename topicId and subscriptionId to id - Split integration tests into individual files per operation - Rename unit_test.dart to error_propagation_test.dart and refactor fakes - Expand and clarify doc comments across public APIs --- pkgs/google_cloud_pubsub/example/example.dart | 2 +- pkgs/google_cloud_pubsub/lib/src/client.dart | 246 ++++++------ pkgs/google_cloud_pubsub/lib/src/message.dart | 7 +- .../lib/src/pubsub_emulator_host_vm.dart | 21 +- .../lib/src/subscription.dart | 29 +- pkgs/google_cloud_pubsub/lib/src/topic.dart | 29 +- .../test/acknowledge_test.dart | 55 +++ .../test/create_subscription_test.dart | 74 ++++ .../test/create_topic_test.dart | 62 +++ .../test/delete_topic_test.dart | 43 +++ ..._test.dart => error_propagation_test.dart} | 69 +--- .../test/integration_test.dart | 362 ------------------ .../test/modify_ack_deadline_test.dart | 55 +++ .../test/publish_test.dart | 150 ++++++++ pkgs/google_cloud_pubsub/test/pull_test.dart | 45 +++ .../test/streaming_pull_test.dart | 57 +++ pkgs/google_cloud_pubsub/test/test_utils.dart | 69 ++++ 17 files changed, 794 insertions(+), 581 deletions(-) create mode 100644 pkgs/google_cloud_pubsub/test/acknowledge_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/create_subscription_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/create_topic_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/delete_topic_test.dart rename pkgs/google_cloud_pubsub/test/{unit_test.dart => error_propagation_test.dart} (84%) delete mode 100644 pkgs/google_cloud_pubsub/test/integration_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/modify_ack_deadline_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/publish_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/pull_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/streaming_pull_test.dart create mode 100644 pkgs/google_cloud_pubsub/test/test_utils.dart diff --git a/pkgs/google_cloud_pubsub/example/example.dart b/pkgs/google_cloud_pubsub/example/example.dart index aae03be4..92b81899 100644 --- a/pkgs/google_cloud_pubsub/example/example.dart +++ b/pkgs/google_cloud_pubsub/example/example.dart @@ -33,7 +33,7 @@ Future main() async { try { // The client will use the authenticator to make authenticated requests. final topic = pubsub.topic('my-topic'); - print('Successfully initialized client for topic: ${topic.topicId}'); + print('Successfully initialized client for topic: ${topic.id}'); } finally { await pubsub.close(); } diff --git a/pkgs/google_cloud_pubsub/lib/src/client.dart b/pkgs/google_cloud_pubsub/lib/src/client.dart index e42afcca..db78ec3e 100644 --- a/pkgs/google_cloud_pubsub/lib/src/client.dart +++ b/pkgs/google_cloud_pubsub/lib/src/client.dart @@ -19,8 +19,8 @@ import 'package:meta/meta.dart'; import '../google_cloud_pubsub.dart'; import 'generated/google/pubsub/v1/pubsub.pbgrpc.dart' as grpc; import 'pubsub_emulator_host_vm.dart'; -import 'subscription.dart' show newSubscription, newSubscriptionName; -import 'topic.dart' show newTopic, newTopicName; + +const _pubsubScopes = ['https://www.googleapis.com/auth/pubsub']; /// API for flexible, reliable, large-scale messaging. /// @@ -32,11 +32,11 @@ final class PubSub { final bool _isEmulator; grpc.PublisherClient? _publisherClient; grpc.SubscriberClient? _subscriberClient; - final BaseAuthenticator? _authenticator; + final FutureOr? _authenticator; static String? _calculateProjectId( String? projectId, - String? emulatorHost, + Uri? emulatorHost, ) => switch ((projectId, emulatorHost)) { (final String projectId, _) => projectId, // When the emulator is active (emulatorHost is not null), we fall back @@ -47,7 +47,7 @@ final class PubSub { static ClientChannel _calculateChannel( String? apiEndpoint, - String? emulatorHost, + Uri? emulatorHost, ) { if (apiEndpoint != null) { return ClientChannel( @@ -56,10 +56,7 @@ final class PubSub { ); } - if (emulatorHost case String host) { - final uri = host.startsWith('http://') || host.startsWith('https://') - ? Uri.parse(host) - : Uri.http(host); + if (emulatorHost case final uri?) { return ClientChannel( uri.host, port: uri.hasPort ? uri.port : 8085, @@ -136,7 +133,7 @@ final class PubSub { String? apiEndpoint, BaseAuthenticator? authenticator, }) { - final emulatorHost = pubsubEmulatorHost; + final emulatorHost = pubSubEmulatorHost; final resolvedProjectId = _calculateProjectId(projectId, emulatorHost); if (resolvedProjectId == null) { throw ArgumentError( @@ -148,19 +145,17 @@ final class PubSub { resolvedProjectId, _calculateChannel(apiEndpoint, emulatorHost), emulatorHost != null, - authenticator, + authenticator ?? + (emulatorHost != null + ? null + : applicationDefaultCredentialsAuthenticator(_pubsubScopes)), ); } Future get _callOptions async { - if (_isEmulator) { - return CallOptions(); - } - final authenticator = _authenticator; - if (authenticator == null) { - return CallOptions(); - } - return authenticator.toCallOptions; + if (_isEmulator) return CallOptions(); + final authenticator = await _authenticator; + return authenticator?.toCallOptions ?? CallOptions(); } grpc.PublisherClient get _publisher => @@ -176,29 +171,30 @@ final class PubSub { // Topic-related methods /// A [Topic] object with the given [unqualifiedName] in the client's project. - Topic topic(String unqualifiedName) => newTopic(this, unqualifiedName); + Topic topic(String unqualifiedName) => + Topic.unqualified(this, unqualifiedName); /// A [Topic] object with the given [name]. /// /// The [name] must be in the format `projects//topics/`. /// Useful for cross-project access. - Topic topicName(String name) => newTopicName(this, name); + Topic topicName(String name) => Topic(this, name); /// A [Subscription] object with the given [unqualifiedName] in the client's /// project. Subscription subscription(String unqualifiedName) => - newSubscription(this, unqualifiedName); + Subscription.unqualified(this, unqualifiedName); /// A [Subscription] object with the given [name]. /// /// The [name] must be in the format /// `projects//subscriptions/`. /// Useful for cross-project access. - Subscription subscriptionName(String name) => newSubscriptionName(this, name); + Subscription subscriptionName(String name) => Subscription(this, name); - /// Creates the given topic with the given [name]. + /// Creates the given topic with the given [topic]. /// - /// The [name] must be in the format `projects//topics/`. + /// The [topic] must be in the format `projects//topics/`. /// /// Throws a [TopicAlreadyExistsException] if the topic already exists. /// @@ -206,58 +202,52 @@ final class PubSub { // TODO(sigurdm): Support configuring topic options (labels, // messageStoragePolicy, kmsKeyName, schemaSettings, // messageRetentionDuration). - Future createTopic(String name) async { - final topic = grpc.Topic()..name = name; + Future createTopic(String topic) async { + final t = grpc.Topic()..name = topic; try { - await _publisher.createTopic(topic, options: await _callOptions); - return topicName(name); + await _publisher.createTopic(t, options: await _callOptions); + return topicName(topic); } on GrpcError catch (e) { - if (e.code == StatusCode.alreadyExists) { - throw TopicAlreadyExistsException(name); - } - throw PubSubOperationException( - e.code, - e.message ?? 'Unknown error', - e.trailers ?? const {}, + throw _mapGrpcError( + e, + specificMappings: { + StatusCode.alreadyExists: (_) => TopicAlreadyExistsException(topic), + }, ); } } - /// Deletes the topic with the given [name]. + /// Deletes the topic with the given [topic]. /// - /// The [name] must be in the format `projects//topics/`. + /// The [topic] must be in the format `projects//topics/`. /// - /// Returns `true` if the topic was deleted, or `false` if the topic did not - /// exist. + /// Throws a [TopicNotFoundException] if the topic does not exist. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.DeleteTopic). - Future deleteTopic(String name) async { - final request = grpc.DeleteTopicRequest()..topic = name; + Future deleteTopic(String topic) async { + final request = grpc.DeleteTopicRequest()..topic = topic; try { await _publisher.deleteTopic(request, options: await _callOptions); - return true; } on GrpcError catch (e) { - if (e.code == StatusCode.notFound) { - return false; - } - throw PubSubOperationException( - e.code, - e.message ?? 'Unknown error', - e.trailers ?? const {}, + throw _mapGrpcError( + e, + specificMappings: { + StatusCode.notFound: (_) => TopicNotFoundException(topic), + }, ); } } /// Adds one or more messages to the topic. /// - /// The [name] must be in the format `projects//topics/`. + /// The [topic] must be in the format `projects//topics/`. /// /// Throws a [TopicNotFoundException] if the topic does not exist. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.Publish). // TODO(sigurdm): Support batch publishing (publishMany) for high-throughput. Future publish( - String name, + String topic, List data, { Map? attributes, }) async { @@ -267,7 +257,7 @@ final class PubSub { } final request = grpc.PublishRequest() - ..topic = name + ..topic = topic ..messages.add(message); try { @@ -277,13 +267,11 @@ final class PubSub { ); return response.messageIds.first; } on GrpcError catch (e) { - if (e.code == StatusCode.notFound) { - throw TopicNotFoundException(name); - } - throw PubSubOperationException( - e.code, - e.message ?? 'Unknown error', - e.trailers ?? const {}, + throw _mapGrpcError( + e, + specificMappings: { + StatusCode.notFound: (_) => TopicNotFoundException(topic), + }, ); } } @@ -300,7 +288,7 @@ final class PubSub { /// Creates a subscription to a given topic. /// - /// The [name] must be in the format + /// The [subscription] must be in the format /// `projects//subscriptions/`. /// The [topic] must be in the format `projects//topics/`. /// @@ -314,77 +302,71 @@ final class PubSub { // (ackDeadlineSeconds, pushConfig, deadLetterPolicy, retryPolicy, // retainAckedMessages, enableExactlyOnceDelivery). Future createSubscription( - String name, { + String subscription, { required String topic, }) async { - final subscription = grpc.Subscription() - ..name = name + final sub = grpc.Subscription() + ..name = subscription ..topic = topic; try { - await _subscriber.createSubscription( - subscription, - options: await _callOptions, - ); - return subscriptionName(name); + await _subscriber.createSubscription(sub, options: await _callOptions); + return subscriptionName(subscription); } on GrpcError catch (e) { - if (e.code == StatusCode.alreadyExists) { - throw SubscriptionAlreadyExistsException(name); - } - if (e.code == StatusCode.notFound) { - throw TopicNotFoundException(topic); - } - throw PubSubOperationException( - e.code, - e.message ?? 'Unknown error', - e.trailers ?? const {}, + throw _mapGrpcError( + e, + specificMappings: { + StatusCode.alreadyExists: (_) => + SubscriptionAlreadyExistsException(subscription), + StatusCode.notFound: (_) => TopicNotFoundException(topic), + }, ); } } /// Deletes an existing subscription. /// - /// The [name] must be in the format + /// The [subscription] must be in the format /// `projects//subscriptions/`. /// - /// All messages retained in the subscription are immediately dropped. - /// - /// Returns `true` if the subscription was deleted, or `false` if the - /// subscription did not exist. + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.DeleteSubscription). - Future deleteSubscription(String name) async { - final request = grpc.DeleteSubscriptionRequest()..subscription = name; + Future deleteSubscription(String subscription) async { + final request = grpc.DeleteSubscriptionRequest() + ..subscription = subscription; try { await _subscriber.deleteSubscription( request, options: await _callOptions, ); - return true; } on GrpcError catch (e) { - if (e.code == StatusCode.notFound) { - return false; - } - throw PubSubOperationException( - e.code, - e.message ?? 'Unknown error', - e.trailers ?? const {}, + throw _mapGrpcError( + e, + specificMappings: { + StatusCode.notFound: (_) => + SubscriptionNotFoundException(subscription), + }, ); } } /// Pulls messages from the server. /// - /// The [name] must be in the format + /// The [subscription] must be in the format /// `projects//subscriptions/`. /// /// Throws a [SubscriptionNotFoundException] if the subscription does not /// exist. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Pull). - Future> pull(String name, {int maxMessages = 1}) async { + Future> pull( + String subscription, { + int maxMessages = 1, + }) async { final request = grpc.PullRequest() - ..subscription = name + ..subscription = subscription ..maxMessages = maxMessages; try { @@ -395,13 +377,12 @@ final class PubSub { return response.receivedMessages.map(_mapReceivedMessage).toList(); } on GrpcError catch (e) { - if (e.code == StatusCode.notFound) { - throw SubscriptionNotFoundException(name); - } - throw PubSubOperationException( - e.code, - e.message ?? 'Unknown error', - e.trailers ?? const {}, + throw _mapGrpcError( + e, + specificMappings: { + StatusCode.notFound: (_) => + SubscriptionNotFoundException(subscription), + }, ); } } @@ -409,7 +390,7 @@ final class PubSub { /// Establishes a stream with the server, which sends messages down to the /// client. /// - /// The [name] must be in the format + /// The [subscription] must be in the format /// `projects//subscriptions/`. /// /// The client streams acknowledgments and ack deadline modifications @@ -424,7 +405,7 @@ final class PubSub { /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.StreamingPull). Stream streamingPull( - String name, { + String subscription, { int streamAckDeadlineSeconds = 10, }) async* { final requestController = StreamController(); @@ -432,7 +413,7 @@ final class PubSub { final options = await _callOptions; requestController.add( grpc.StreamingPullRequest() - ..subscription = name + ..subscription = subscription ..streamAckDeadlineSeconds = streamAckDeadlineSeconds, ); // TODO(sigurdm): Retry on broken connections. @@ -458,7 +439,7 @@ final class PubSub { /// Acknowledges the messages associated with the `ack_ids`. /// - /// The [name] must be in the format + /// The [subscription] must be in the format /// `projects//subscriptions/`. /// /// The Pub/Sub system can remove the relevant messages from the subscription. @@ -471,28 +452,27 @@ final class PubSub { /// exist. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.Acknowledge). - Future acknowledge(String name, List ackIds) async { + Future acknowledge(String subscription, List ackIds) async { final request = grpc.AcknowledgeRequest() - ..subscription = name + ..subscription = subscription ..ackIds.addAll(ackIds); try { await _subscriber.acknowledge(request, options: await _callOptions); } on GrpcError catch (e) { - if (e.code == StatusCode.notFound) { - throw SubscriptionNotFoundException(name); - } - throw PubSubOperationException( - e.code, - e.message ?? 'Unknown error', - e.trailers ?? const {}, + throw _mapGrpcError( + e, + specificMappings: { + StatusCode.notFound: (_) => + SubscriptionNotFoundException(subscription), + }, ); } } /// Modifies the ack deadline for a list of specific messages. /// - /// The [name] must be in the format + /// The [subscription] must be in the format /// `projects//subscriptions/`. /// /// This method is useful to indicate that more time is needed to process a @@ -509,25 +489,24 @@ final class PubSub { /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.ModifyAckDeadline). Future modifyAckDeadline( - String name, + String subscription, List ackIds, int ackDeadlineSeconds, ) async { final request = grpc.ModifyAckDeadlineRequest() - ..subscription = name + ..subscription = subscription ..ackIds.addAll(ackIds) ..ackDeadlineSeconds = ackDeadlineSeconds; try { await _subscriber.modifyAckDeadline(request, options: await _callOptions); } on GrpcError catch (e) { - if (e.code == StatusCode.notFound) { - throw SubscriptionNotFoundException(name); - } - throw PubSubOperationException( - e.code, - e.message ?? 'Unknown error', - e.trailers ?? const {}, + throw _mapGrpcError( + e, + specificMappings: { + StatusCode.notFound: (_) => + SubscriptionNotFoundException(subscription), + }, ); } } @@ -555,4 +534,17 @@ final class PubSub { // - DeleteSchema // - ValidateSchema // - ValidateMessage + Exception _mapGrpcError( + GrpcError e, { + Map specificMappings = const {}, + }) { + if (specificMappings[e.code] case final exceptionBuilder?) { + return exceptionBuilder(e); + } + return PubSubOperationException( + e.code, + e.message ?? 'Unknown error', + e.trailers ?? const {}, + ); + } } diff --git a/pkgs/google_cloud_pubsub/lib/src/message.dart b/pkgs/google_cloud_pubsub/lib/src/message.dart index 2c710fff..87b49341 100644 --- a/pkgs/google_cloud_pubsub/lib/src/message.dart +++ b/pkgs/google_cloud_pubsub/lib/src/message.dart @@ -16,7 +16,7 @@ import 'dart:typed_data'; /// A Pub/Sub message. final class Message { - /// The message data. + /// The payload of this message. final Uint8List data; /// Optional attributes for this message. @@ -29,10 +29,11 @@ final class Message { /// A message received from a subscription. final class ReceivedMessage { - /// The ack ID for this message. + /// The acknowledgment ID, used to identify this message when acknowledging + /// it or modifying its acknowledgment deadline. final String ackId; - /// The received message. + /// The message payload and attributes. final Message message; /// The ID of this message, assigned by the server. diff --git a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart index f0e12957..ada3d65b 100644 --- a/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart +++ b/pkgs/google_cloud_pubsub/lib/src/pubsub_emulator_host_vm.dart @@ -73,10 +73,25 @@ String? _environmentVariable(String name) { /// and the emulator configuration might not be available until the application /// is launched. @internal -String? get pubsubEmulatorHost { +Uri? get pubSubEmulatorHost { final host = _environmentVariable('PUBSUB_EMULATOR_HOST'); - if (host?.isEmpty ?? true) return null; - return host; + if (host == null || host.isEmpty) return null; + + final uri = host.startsWith('http://') || host.startsWith('https://') + ? Uri.tryParse(host) + : Uri.tryParse('http://$host'); + + if (uri == null) return null; + + // gRPC channels only require host and port. If the URI contains a path, + // query, or fragment, it is invalid for this purpose. + if ((uri.path.isNotEmpty && uri.path != '/') || + uri.query.isNotEmpty || + uri.fragment.isNotEmpty) { + return null; + } + + return uri; } /// The project ID inferred from the environment. diff --git a/pkgs/google_cloud_pubsub/lib/src/subscription.dart b/pkgs/google_cloud_pubsub/lib/src/subscription.dart index 081183c7..fa6722ea 100644 --- a/pkgs/google_cloud_pubsub/lib/src/subscription.dart +++ b/pkgs/google_cloud_pubsub/lib/src/subscription.dart @@ -14,18 +14,8 @@ import 'dart:async'; -import 'package:meta/meta.dart'; - import '../google_cloud_pubsub.dart'; -@internal -Subscription newSubscription(PubSub pubsub, String subscriptionId) => - Subscription.unqualified(pubsub, subscriptionId); - -@internal -Subscription newSubscriptionName(PubSub pubsub, String name) => - Subscription(pubsub, name); - /// A [Google Cloud Pub/Sub subscription](https://cloud.google.com/pubsub/docs/overview#subscriptions). final class Subscription { static final RegExp _subscriptionNameRegExp = RegExp( @@ -69,29 +59,34 @@ final class Subscription { } } - /// The ID of this subscription. - String get subscriptionId => name.split('/').last; + /// The unqualified ID of this subscription. + String get id => name.split('/').last; - /// Creates a subscription to a given topic. + /// Creates this subscription on the server, associating it with the [topic]. + /// + /// The subscription must not already exist on the server. + /// The [topic] must exist on the server. /// /// Throws a [SubscriptionAlreadyExistsException] if the subscription already /// exists. /// Throws a [TopicNotFoundException] if the corresponding topic doesn't /// exist. /// + /// Returns a [Subscription] instance representing the created subscription. + /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.CreateSubscription). Future create({required String topic}) => pubsub.createSubscription(name, topic: topic); - /// Deletes an existing subscription. + /// Deletes this subscription on the server. /// /// All messages retained in the subscription are immediately dropped. /// - /// Returns `true` if the subscription was deleted, or `false` if the - /// subscription did not exist. + /// Throws a [SubscriptionNotFoundException] if the subscription does not + /// exist. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Subscriber.DeleteSubscription). - Future delete() => pubsub.deleteSubscription(name); + Future delete() => pubsub.deleteSubscription(name); /// Pulls messages from the server. /// diff --git a/pkgs/google_cloud_pubsub/lib/src/topic.dart b/pkgs/google_cloud_pubsub/lib/src/topic.dart index 0452ede0..4cad06cf 100644 --- a/pkgs/google_cloud_pubsub/lib/src/topic.dart +++ b/pkgs/google_cloud_pubsub/lib/src/topic.dart @@ -12,17 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import 'package:meta/meta.dart'; - import '../google_cloud_pubsub.dart'; -@internal -Topic newTopic(PubSub pubsub, String topicId) => - Topic.unqualified(pubsub, topicId); - -@internal -Topic newTopicName(PubSub pubsub, String name) => Topic(pubsub, name); - /// A [Google Cloud Pub/Sub topic](https://cloud.google.com/pubsub/docs/overview#topics). final class Topic { static final RegExp _topicNameRegExp = RegExp( @@ -66,20 +57,26 @@ final class Topic { } } - /// The ID of this topic. - String get topicId => name.split('/').last; + /// The unqualified ID of this topic. + String get id => name.split('/').last; - /// Creates the given topic. + /// Creates this topic on the server. + /// + /// The topic must not already exist on the server. + /// + /// A topic must exist on the server before you can publish messages to it + /// or create subscriptions for it. /// /// Throws a [TopicAlreadyExistsException] if the topic already exists. /// + /// Returns a [Topic] instance representing the created topic. + /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.CreateTopic). Future create() => pubsub.createTopic(name); - /// Deletes the topic. + /// Deletes this topic on the server. /// - /// Returns `true` if the topic was deleted, or `false` if the topic did not - /// exist. + /// Throws a [TopicNotFoundException] if the topic does not exist. /// /// After a topic is deleted, a new topic may be created with the same name; /// this is an entirely new topic with none of the old configuration or @@ -87,7 +84,7 @@ final class Topic { /// their `topic` field is set to `_deleted-topic_`. /// /// See the [official documentation](https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.Publisher.DeleteTopic). - Future delete() => pubsub.deleteTopic(name); + Future delete() => pubsub.deleteTopic(name); /// Adds one or more messages to the topic. /// diff --git a/pkgs/google_cloud_pubsub/test/acknowledge_test.dart b/pkgs/google_cloud_pubsub/test/acknowledge_test.dart new file mode 100644 index 00000000..9df1c9b9 --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/acknowledge_test.dart @@ -0,0 +1,55 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +void main() { + group('acknowledge', () { + late PubSub client; + + setUp(() async { + client = await createClient(); + }); + + tearDown(() async { + await client.close(); + }); + + test('acknowledge for non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client.subscription(subscriptionName); + + expect( + () => subscription.acknowledgeNow([ + ReceivedMessage( + ackId: 'ack-id', + messageId: 'msg-id', + publishTime: DateTime.now(), + message: Message(data: []), + ), + ]), + throwsA(isA()), + ); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/create_subscription_test.dart b/pkgs/google_cloud_pubsub/test/create_subscription_test.dart new file mode 100644 index 00000000..c619fb21 --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/create_subscription_test.dart @@ -0,0 +1,74 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +void main() { + group('createSubscription', () { + late PubSub client; + + setUp(() async { + client = await createClient(); + }); + + tearDown(() async { + await client.close(); + }); + + test( + 'create existing subscription throws SubscriptionAlreadyExistsException', + () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + final subscription = client.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + expect( + () => subscription.create(topic: topic.name), + throwsA(isA()), + ); + + await subscription.delete(); + await topic.delete(); + }, + retry: isEmulator ? 3 : 0, + ); + + test('create subscription for non-existent topic throws ' + 'TopicNotFoundException', () async { + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client.subscription(subscriptionName); + + expect( + () => + subscription.create(topic: client.topic('non-existent-topic').name), + throwsA(isA()), + ); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/create_topic_test.dart b/pkgs/google_cloud_pubsub/test/create_topic_test.dart new file mode 100644 index 00000000..0a7ddb97 --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/create_topic_test.dart @@ -0,0 +1,62 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +void main() { + group('createTopic', () { + late PubSub client; + + setUp(() async { + client = await createClient(); + }); + + tearDown(() async { + await client.close(); + }); + + test('create topic', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await topic.delete(); + }); + + test( + 'create existing topic throws TopicAlreadyExistsException', + () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + expect(topic.create(), throwsA(isA())); + + await topic.delete(); + }, + retry: isEmulator ? 3 : 0, + ); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/delete_topic_test.dart b/pkgs/google_cloud_pubsub/test/delete_topic_test.dart new file mode 100644 index 00000000..b94e28ee --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/delete_topic_test.dart @@ -0,0 +1,43 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +void main() { + group('deleteTopic', () { + late PubSub client; + + setUp(() async { + client = await createClient(); + }); + + tearDown(() async { + await client.close(); + }); + + test('Delete non-existent topic throws TopicNotFoundException', () async { + final topic = client.topic( + 'non-existent-${DateTime.now().millisecondsSinceEpoch}', + ); + expect(topic.delete(), throwsA(isA())); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/unit_test.dart b/pkgs/google_cloud_pubsub/test/error_propagation_test.dart similarity index 84% rename from pkgs/google_cloud_pubsub/test/unit_test.dart rename to pkgs/google_cloud_pubsub/test/error_propagation_test.dart index 764d995f..ee00a0a1 100644 --- a/pkgs/google_cloud_pubsub/test/unit_test.dart +++ b/pkgs/google_cloud_pubsub/test/error_propagation_test.dart @@ -27,10 +27,11 @@ import 'package:protobuf/well_known_types/google/protobuf/empty.pb.dart' as protobuf; import 'package:protobuf/well_known_types/google/protobuf/timestamp.pb.dart' as pb_ts; +import 'package:test/fake.dart'; import 'package:test/test.dart'; // A fake ResponseFuture that delegates to a standard Future. -class FakeResponseFuture implements grpc.ResponseFuture { +class FakeResponseFuture extends Fake implements grpc.ResponseFuture { final Future _future; FakeResponseFuture(this._future); @@ -71,58 +72,28 @@ class FakeResponseFuture implements grpc.ResponseFuture { _future.whenComplete(action); @override - dynamic noSuchMethod(Invocation invocation) { - if (invocation.memberName == #cancel) { - return Future.value(); - } - return super.noSuchMethod(invocation); - } + Future cancel() => Future.value(); } // A fake ResponseStream that delegates to a standard Stream. -class FakeResponseStream extends Stream +class FakeResponseStream extends StreamView implements grpc.ResponseStream { - final Stream _stream; + FakeResponseStream(super.stream); - FakeResponseStream(this._stream); + @override + grpc.ResponseFuture get single => FakeResponseFuture(super.single); @override - StreamSubscription listen( - void Function(T event)? onData, { - Function? onError, - void Function()? onDone, - bool? cancelOnError, - }) => _stream.listen( - onData, - onError: (Object e, StackTrace s) { - if (onError != null) { - if (onError is void Function(Object, StackTrace)) { - onError(e, s); - } else if (onError is void Function(Object)) { - onError(e); - } else { - // ignore: avoid_dynamic_calls - (onError as dynamic)(e, s); - } - } - }, - onDone: onDone, - cancelOnError: cancelOnError, - ); + Future cancel() => Future.value(); @override - grpc.ResponseFuture get single => FakeResponseFuture(_stream.single); + Future> get headers => Future.value(const {}); @override - dynamic noSuchMethod(Invocation invocation) { - if (invocation.memberName == #cancel) { - return Future.value(); - } - return super.noSuchMethod(invocation); - } + Future> get trailers => Future.value(const {}); } -class FakeSubscriberClient implements generated.SubscriberClient { +class FakeSubscriberClient extends Fake implements generated.SubscriberClient { final StreamController streamingPullController = StreamController(); @@ -142,7 +113,7 @@ class FakeSubscriberClient implements generated.SubscriberClient { grpc.CallOptions? options, }) { // Listen to request stream to prevent sender from hanging on close() - request.listen((_) {}, onDone: () {}); + unawaited(request.drain()); return FakeResponseStream(streamingPullController.stream); } @@ -155,8 +126,8 @@ class FakeSubscriberClient implements generated.SubscriberClient { lastAckIds = request.ackIds; final completer = Completer(); - if (acknowledgeBehavior != null) { - acknowledgeBehavior!(request.ackIds) + if (acknowledgeBehavior case final acknowledge?) { + acknowledge(request.ackIds) .then((_) => completer.complete(protobuf.Empty())) .catchError(completer.completeError); } else { @@ -175,8 +146,8 @@ class FakeSubscriberClient implements generated.SubscriberClient { lastModifyAckDeadlineSeconds = request.ackDeadlineSeconds; final completer = Completer(); - if (modifyAckDeadlineBehavior != null) { - modifyAckDeadlineBehavior!(request.ackIds, request.ackDeadlineSeconds) + if (modifyAckDeadlineBehavior case final modifyAckDeadline?) { + modifyAckDeadline(request.ackIds, request.ackDeadlineSeconds) .then((_) => completer.complete(protobuf.Empty())) .catchError(completer.completeError); } else { @@ -184,19 +155,13 @@ class FakeSubscriberClient implements generated.SubscriberClient { } return FakeResponseFuture(completer.future); } - - @override - dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } -class FakeClientChannel implements grpc.ClientChannel { +class FakeClientChannel extends Fake implements grpc.ClientChannel { @override Future shutdown() async { // No-op for testing } - - @override - dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } void main() { diff --git a/pkgs/google_cloud_pubsub/test/integration_test.dart b/pkgs/google_cloud_pubsub/test/integration_test.dart deleted file mode 100644 index 528bd7ea..00000000 --- a/pkgs/google_cloud_pubsub/test/integration_test.dart +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2026 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -@TestOn('vm') -@Tags(['firebase-emulator']) -library; - -import 'dart:convert'; -import 'dart:io'; - -import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; -import 'package:test/test.dart'; - -void main() { - final isEmulator = Platform.environment['PUBSUB_EMULATOR_HOST'] != null; - - group('PubSub Integration', () { - PubSub? client; - - /// Pulls up to [count] messages from the [subscription], retrying up to 10 - /// times with a 1-second delay between attempts if the expected count is - /// not met. - /// - /// Because message delivery in Google Cloud Pub/Sub is eventually consistent, - /// a published message may not be immediately available in the first pull - /// request. Polling dynamically like this avoids both test flakiness (by - /// waiting up to 10 seconds) and unnecessary test suite delay (by returning - /// instantly as soon as all messages are retrieved). - Future> pullReliably( - Subscription subscription, { - required int count, - }) async { - final messages = []; - for (var i = 0; i < 10 && messages.length < count; i++) { - if (i > 0) { - await Future.delayed(const Duration(seconds: 1)); - } - final pulled = await subscription.pull( - maxMessages: count - messages.length, - ); - messages.addAll(pulled); - } - return messages; - } - - setUp(() async { - final host = Platform.environment['PUBSUB_EMULATOR_HOST']; - final project = Platform.environment['GOOGLE_CLOUD_PROJECT']; - - if (host != null) { - client = PubSub(projectId: 'test-project'); - } else if (project != null) { - client = PubSub( - projectId: project, - authenticator: await applicationDefaultCredentialsAuthenticator([ - 'https://www.googleapis.com/auth/pubsub', - ]), - ); - } else { - fail( - 'Neither PUBSUB_EMULATOR_HOST nor GOOGLE_CLOUD_PROJECT ' - 'environment variable set', - ); - } - }); - - tearDown(() async { - await client?.close(); - }); - - test('create topic and publish message', () async { - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - - // Create topic - await topic.create(); - addTearDown(() async => await topic.delete()); - - // Publish message - final messageId = await topic.publish(utf8.encode('Hello World')); - expect(messageId, isNotNull); - - // Delete topic - expect(await topic.delete(), isTrue); - }); - - test('Delete non-existent topic returns false', () async { - final topic = client!.topic( - 'non-existent-${DateTime.now().millisecondsSinceEpoch}', - ); - final deleted = await topic.delete(); - expect(deleted, isFalse); - }); - - test( - 'create existing topic throws TopicAlreadyExistsException', - () async { - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - - await topic.create(); - addTearDown(() async => await topic.delete()); - - expect(topic.create(), throwsA(isA())); - - await topic.delete(); - }, - // Retry to handle occasional emulator race conditions where duplicate - // topic creation succeeds instead of throwing. - retry: isEmulator ? 3 : 0, - ); - - test( - 'create existing subscription throws SubscriptionAlreadyExistsException', - () async { - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = - 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - final subscription = client!.subscription(subscriptionName); - - await topic.create(); - addTearDown(() async => await topic.delete()); - await subscription.create(topic: topic.name); - addTearDown(() async => await subscription.delete()); - - expect( - () => subscription.create(topic: topic.name), - throwsA(isA()), - ); - - await subscription.delete(); - await topic.delete(); - }, - // Retry to handle occasional emulator race conditions where duplicate - // subscription creation succeeds instead of throwing. - retry: isEmulator ? 3 : 0, - ); - - test('create subscription for non-existent topic throws ' - 'TopicNotFoundException', () async { - final subscriptionName = - 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; - final subscription = client!.subscription(subscriptionName); - - expect( - () => subscription.create( - topic: client!.topic('non-existent-topic').name, - ), - throwsA(isA()), - ); - }); - - test( - 'publish to non-existent topic throws TopicNotFoundException', - () async { - final topicName = - 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - - expect( - () => topic.publish(utf8.encode('Hello')), - throwsA(isA()), - ); - }, - ); - - test('pull from non-existent subscription throws ' - 'SubscriptionNotFoundException', () async { - final subscriptionName = - 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; - final subscription = client!.subscription(subscriptionName); - - expect(subscription.pull, throwsA(isA())); - }); - - test('acknowledge for non-existent subscription throws ' - 'SubscriptionNotFoundException', () async { - final subscriptionName = - 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; - final subscription = client!.subscription(subscriptionName); - - expect( - () => subscription.acknowledgeNow([ - ReceivedMessage( - ackId: 'ack-id', - messageId: 'msg-id', - publishTime: DateTime.now(), - message: Message(data: []), - ), - ]), - throwsA(isA()), - ); - }); - - test('modifyAckDeadline for non-existent subscription throws ' - 'SubscriptionNotFoundException', () async { - final subscriptionName = - 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; - final subscription = client!.subscription(subscriptionName); - - expect( - () => subscription.modifyAckDeadlineNow([ - ReceivedMessage( - ackId: 'ack-id', - messageId: 'msg-id', - publishTime: DateTime.now(), - message: Message(data: []), - ), - ], 10), - throwsA(isA()), - ); - }); - - test('publish and pull message', () async { - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = - 'test-sub-' - '${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - final subscription = client!.subscription(subscriptionName); - - await topic.create(); - addTearDown(() async => await topic.delete()); - - await subscription.create(topic: topic.name); - addTearDown(() async => await subscription.delete()); - - final data = utf8.encode('Hello PubSub'); - await topic.publish(data); - - // Pull message - final messages = await pullReliably(subscription, count: 1); - expect(messages, hasLength(1)); - expect(messages.first.data, equals(data)); - - // Ack message - await subscription.acknowledgeNow([messages.first]); - }); - - test('publish and streaming pull message', () async { - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = - 'test-sub-' - '${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - final subscription = client!.subscription(subscriptionName); - - await topic.create(); - addTearDown(() async => await topic.delete()); - - await subscription.create(topic: topic.name); - addTearDown(() async => await subscription.delete()); - - final data = utf8.encode('Hello Streaming PubSub'); - await topic.publish(data); - - // Start streaming pull - final stream = subscription.streamingPull(); - - // Use stream.first to get the first message and automatically cancel the - // stream. - final receivedMessage = await stream.first; - - expect(receivedMessage.data, equals(data)); - - // Ack message - await subscription.acknowledgeNow([receivedMessage]); - }); - - test('streaming pull throws StreamBrokenException ' - 'when subscription is deleted', () async { - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = - 'test-sub-' - '${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - final subscription = client!.subscription(subscriptionName); - - await topic.create(); - addTearDown(() async => await topic.delete()); - - await subscription.create(topic: topic.name); - - // Start streaming pull - final stream = subscription.streamingPull(); - - // Delete subscription to break the stream - await subscription.delete(); - - // Expect stream to throw StreamBrokenException - expect(stream.first, throwsA(isA())); - }); - - test('publish and pull message with attributes', () async { - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = - 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - final subscription = client!.subscription(subscriptionName); - - await topic.create(); - addTearDown(() async => await topic.delete()); - - await subscription.create(topic: topic.name); - addTearDown(() async => await subscription.delete()); - - final data = utf8.encode('Hello PubSub with Attributes'); - final attributes = {'key1': 'value1', 'key2': 'value2'}; - await topic.publish(data, attributes: attributes); - - // Pull message - final messages = await pullReliably(subscription, count: 1); - expect(messages, hasLength(1)); - expect(messages.first.data, equals(data)); - expect(messages.first.attributes, equals(attributes)); - - // Ack message - await subscription.acknowledgeNow([messages.first]); - }); - - test('publish multiple messages and pull batch', () async { - final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; - final subscriptionName = - 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; - final topic = client!.topic(topicName); - final subscription = client!.subscription(subscriptionName); - - await topic.create(); - addTearDown(() async => await topic.delete()); - - await subscription.create(topic: topic.name); - addTearDown(() async => await subscription.delete()); - - final data1 = utf8.encode('Message 1'); - final data2 = utf8.encode('Message 2'); - await topic.publish(data1); - await topic.publish(data2); - - // Pull messages - final messages = await pullReliably(subscription, count: 2); - expect(messages, hasLength(2)); - - final receivedData = messages.map((m) => m.data).toList(); - expect(receivedData, containsAll([data1, data2])); - - // Ack messages - await subscription.acknowledgeNow(messages); - }); - }); -} diff --git a/pkgs/google_cloud_pubsub/test/modify_ack_deadline_test.dart b/pkgs/google_cloud_pubsub/test/modify_ack_deadline_test.dart new file mode 100644 index 00000000..64a37c33 --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/modify_ack_deadline_test.dart @@ -0,0 +1,55 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +void main() { + group('modifyAckDeadline', () { + late PubSub client; + + setUp(() async { + client = await createClient(); + }); + + tearDown(() async { + await client.close(); + }); + + test('modifyAckDeadline for non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client.subscription(subscriptionName); + + expect( + () => subscription.modifyAckDeadlineNow([ + ReceivedMessage( + ackId: 'ack-id', + messageId: 'msg-id', + publishTime: DateTime.now(), + message: Message(data: []), + ), + ], 10), + throwsA(isA()), + ); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/publish_test.dart b/pkgs/google_cloud_pubsub/test/publish_test.dart new file mode 100644 index 00000000..2ad224bd --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/publish_test.dart @@ -0,0 +1,150 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'dart:convert'; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +void main() { + group('publish', () { + late PubSub client; + + setUp(() async { + client = await createClient(); + }); + + tearDown(() async { + await client.close(); + }); + + test( + 'publish to non-existent topic throws TopicNotFoundException', + () async { + final topicName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + + expect( + () => topic.publish(utf8.encode('Hello')), + throwsA(isA()), + ); + }, + ); + + test('publish and pull message', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + final subscription = client.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello PubSub'); + await topic.publish(data); + + final messages = await pullReliably(subscription, count: 1); + expect(messages, hasLength(1)); + expect(messages.first.data, equals(data)); + + await subscription.acknowledgeNow([messages.first]); + }); + + test('publish and streaming pull message', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + final subscription = client.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello Streaming PubSub'); + await topic.publish(data); + + final stream = subscription.streamingPull(); + final receivedMessage = await stream.first; + + expect(receivedMessage.data, equals(data)); + await subscription.acknowledgeNow([receivedMessage]); + }); + + test('publish and pull message with attributes', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + final subscription = client.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + final data = utf8.encode('Hello PubSub with Attributes'); + final attributes = {'key1': 'value1', 'key2': 'value2'}; + await topic.publish(data, attributes: attributes); + + final messages = await pullReliably(subscription, count: 1); + expect(messages, hasLength(1)); + expect(messages.first.data, equals(data)); + expect(messages.first.attributes, equals(attributes)); + + await subscription.acknowledgeNow([messages.first]); + }); + + test('publish multiple messages and pull batch', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + final subscription = client.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + addTearDown(() async => await subscription.delete()); + + final data1 = utf8.encode('Message 1'); + final data2 = utf8.encode('Message 2'); + await topic.publish(data1); + await topic.publish(data2); + + final messages = await pullReliably(subscription, count: 2); + expect(messages, hasLength(2)); + + final receivedData = messages.map((m) => m.data).toList(); + expect(receivedData, containsAll([data1, data2])); + + await subscription.acknowledgeNow(messages); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/pull_test.dart b/pkgs/google_cloud_pubsub/test/pull_test.dart new file mode 100644 index 00000000..182aae0d --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/pull_test.dart @@ -0,0 +1,45 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +void main() { + group('pull', () { + late PubSub client; + + setUp(() async { + client = await createClient(); + }); + + tearDown(() async { + await client.close(); + }); + + test('pull from non-existent subscription throws ' + 'SubscriptionNotFoundException', () async { + final subscriptionName = + 'non-existent-${DateTime.now().millisecondsSinceEpoch}'; + final subscription = client.subscription(subscriptionName); + + expect(subscription.pull, throwsA(isA())); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/streaming_pull_test.dart b/pkgs/google_cloud_pubsub/test/streaming_pull_test.dart new file mode 100644 index 00000000..e9cccbd2 --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/streaming_pull_test.dart @@ -0,0 +1,57 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +@Tags(['firebase-emulator']) +library; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +import 'test_utils.dart'; + +void main() { + group('streamingPull', () { + late PubSub client; + + setUp(() async { + client = await createClient(); + }); + + tearDown(() async { + await client.close(); + }); + + test('streaming pull throws StreamBrokenException ' + 'when subscription is deleted', () async { + final topicName = 'test-topic-${DateTime.now().millisecondsSinceEpoch}'; + final subscriptionName = + 'test-sub-${DateTime.now().millisecondsSinceEpoch}'; + final topic = client.topic(topicName); + final subscription = client.subscription(subscriptionName); + + await topic.create(); + addTearDown(() async => await topic.delete()); + + await subscription.create(topic: topic.name); + + final stream = subscription.streamingPull(); + + // Delete subscription to break the stream + await subscription.delete(); + + expect(stream.first, throwsA(isA())); + }); + }); +} diff --git a/pkgs/google_cloud_pubsub/test/test_utils.dart b/pkgs/google_cloud_pubsub/test/test_utils.dart new file mode 100644 index 00000000..4c907e9b --- /dev/null +++ b/pkgs/google_cloud_pubsub/test/test_utils.dart @@ -0,0 +1,69 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'dart:io'; + +import 'package:google_cloud_pubsub/google_cloud_pubsub.dart'; +import 'package:test/test.dart'; + +final isEmulator = Platform.environment['PUBSUB_EMULATOR_HOST'] != null; + +/// Creates a [PubSub] client configured for either the emulator or production +/// based on environment variables. +Future createClient() async { + final host = Platform.environment['PUBSUB_EMULATOR_HOST']; + final project = Platform.environment['GOOGLE_CLOUD_PROJECT']; + + if (host != null) { + return PubSub(projectId: 'test-project'); + } else if (project != null) { + return PubSub( + projectId: project, + authenticator: await applicationDefaultCredentialsAuthenticator([ + 'https://www.googleapis.com/auth/pubsub', + ]), + ); + } else { + fail( + 'Neither PUBSUB_EMULATOR_HOST nor GOOGLE_CLOUD_PROJECT ' + 'environment variable set', + ); + } +} + +/// Pulls up to [count] messages from the [subscription], retrying up to 10 +/// times with a 1-second delay between attempts if the expected count is +/// not met. +/// +/// Because message delivery in Google Cloud Pub/Sub is eventually consistent, +/// a published message may not be immediately available in the first pull +/// request. Polling dynamically like this avoids both test flakiness (by +/// waiting up to 10 seconds) and unnecessary test suite delay (by returning +/// instantly as soon as all messages are retrieved). +Future> pullReliably( + Subscription subscription, { + required int count, +}) async { + final messages = []; + for (var i = 0; i < 10 && messages.length < count; i++) { + if (i > 0) { + await Future.delayed(const Duration(seconds: 1)); + } + final pulled = await subscription.pull( + maxMessages: count - messages.length, + ); + messages.addAll(pulled); + } + return messages; +}