Initial commit
This commit is contained in:
+120
@@ -0,0 +1,120 @@
|
||||
// Copyright 2020 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.
|
||||
//
|
||||
|
||||
// This file defines the format of Firestore bundle file/stream. It is not a part of the
|
||||
// Firestore API, only a specification used by Server and Client SDK to write and read
|
||||
// bundles.
|
||||
|
||||
syntax = "proto3";
|
||||
|
||||
package firestore;
|
||||
|
||||
import "google/firestore/v1/document.proto";
|
||||
import "google/firestore/v1/query.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
|
||||
option csharp_namespace = "Firestore.Proto";
|
||||
option go_package = "google.golang.org/genproto/firestore/proto;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "BundleProto";
|
||||
option java_package = "com.google.firestore.proto";
|
||||
option objc_class_prefix = "FSTPB";
|
||||
option php_namespace = "Firestore\\Proto";
|
||||
|
||||
// Encodes a query saved in the bundle.
|
||||
message BundledQuery {
|
||||
// The parent resource name.
|
||||
string parent = 1;
|
||||
|
||||
// The query to run.
|
||||
oneof query_type {
|
||||
// A structured query.
|
||||
google.firestore.v1.StructuredQuery structured_query = 2;
|
||||
}
|
||||
|
||||
// If the query is a limit query, should the limit be applied to the beginning or
|
||||
// the end of results.
|
||||
enum LimitType {
|
||||
FIRST = 0;
|
||||
LAST = 1;
|
||||
}
|
||||
LimitType limit_type = 3;
|
||||
}
|
||||
|
||||
// A Query associated with a name, created as part of the bundle file, and can be read
|
||||
// by client SDKs once the bundle containing them is loaded.
|
||||
message NamedQuery {
|
||||
// Name of the query, such that client can use the name to load this query
|
||||
// from bundle, and resume from when the query results are materialized
|
||||
// into this bundle.
|
||||
string name = 1;
|
||||
|
||||
// The query saved in the bundle.
|
||||
BundledQuery bundled_query = 2;
|
||||
|
||||
// The read time of the query, when it is used to build the bundle. This is useful to
|
||||
// resume the query from the bundle, once it is loaded by client SDKs.
|
||||
google.protobuf.Timestamp read_time = 3;
|
||||
}
|
||||
|
||||
// Metadata describing a Firestore document saved in the bundle.
|
||||
message BundledDocumentMetadata {
|
||||
// The document key of a bundled document.
|
||||
string name = 1;
|
||||
|
||||
// The snapshot version of the document data bundled.
|
||||
google.protobuf.Timestamp read_time = 2;
|
||||
|
||||
// Whether the document exists.
|
||||
bool exists = 3;
|
||||
|
||||
// The names of the queries in this bundle that this document matches to.
|
||||
repeated string queries = 4;
|
||||
}
|
||||
|
||||
// Metadata describing the bundle file/stream.
|
||||
message BundleMetadata {
|
||||
// The ID of the bundle.
|
||||
string id = 1;
|
||||
|
||||
// Time at which the documents snapshot is taken for this bundle.
|
||||
google.protobuf.Timestamp create_time = 2;
|
||||
|
||||
// The schema version of the bundle.
|
||||
uint32 version = 3;
|
||||
|
||||
// The number of documents in the bundle.
|
||||
uint32 total_documents = 4;
|
||||
|
||||
// The size of the bundle in bytes, excluding this `BundleMetadata`.
|
||||
uint64 total_bytes = 5;
|
||||
}
|
||||
|
||||
// A Firestore bundle is a length-prefixed stream of JSON representations of
|
||||
// `BundleElement`.
|
||||
// Only one `BundleMetadata` is expected, and it should be the first element.
|
||||
// The named queries follow after `metadata`. Every `document_metadata` is
|
||||
// immediately followed by a `document`.
|
||||
message BundleElement {
|
||||
oneof element_type {
|
||||
BundleMetadata metadata = 1;
|
||||
|
||||
NamedQuery named_query = 2;
|
||||
|
||||
BundledDocumentMetadata document_metadata = 3;
|
||||
|
||||
google.firestore.v1.Document document = 4;
|
||||
}
|
||||
}
|
||||
Generated
Vendored
+4808
File diff suppressed because it is too large
Load Diff
Generated
Vendored
+11451
File diff suppressed because it is too large
Load Diff
+7132
File diff suppressed because it is too large
Load Diff
+17055
File diff suppressed because it is too large
Load Diff
Generated
Vendored
+6826
File diff suppressed because it is too large
Load Diff
+16318
File diff suppressed because it is too large
Load Diff
+31
@@ -0,0 +1,31 @@
|
||||
// Copyright 2015 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;
|
||||
}
|
||||
+99
@@ -0,0 +1,99 @@
|
||||
// Copyright 2018 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 = "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;
|
||||
}
|
||||
Generated
Vendored
+90
@@ -0,0 +1,90 @@
|
||||
// Copyright 2018 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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
+375
@@ -0,0 +1,375 @@
|
||||
// Copyright 2015 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 cc_enable_arenas = true;
|
||||
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 | gRPC
|
||||
// -----|-----
|
||||
// `GET /v1/messages/123456` | `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 | gRPC
|
||||
// -----|-----
|
||||
// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |
|
||||
// `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 | gRPC
|
||||
// -----|-----
|
||||
// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `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 | gRPC
|
||||
// -----|-----
|
||||
// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `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 | gRPC
|
||||
// -----|-----
|
||||
// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
|
||||
// `GET /v1/users/me/messages/123456` | `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.
|
||||
//
|
||||
// Example:
|
||||
//
|
||||
// http:
|
||||
// rules:
|
||||
// # Selects a gRPC method and applies HttpRule to it.
|
||||
// - 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;
|
||||
}
|
||||
+299
@@ -0,0 +1,299 @@
|
||||
// Copyright 2018 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 cc_enable_arenas = true;
|
||||
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"
|
||||
// name_descriptor: {
|
||||
// pattern: "projects/{project}/topics/{topic}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Project"
|
||||
// parent_name_extractor: "projects/{project}"
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
//
|
||||
// The ResourceDescriptor Yaml config will look like:
|
||||
//
|
||||
// resources:
|
||||
// - type: "pubsub.googleapis.com/Topic"
|
||||
// name_descriptor:
|
||||
// - pattern: "projects/{project}/topics/{topic}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Project"
|
||||
// parent_name_extractor: "projects/{project}"
|
||||
//
|
||||
// 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"
|
||||
// name_descriptor: {
|
||||
// pattern: "projects/{project}/logs/{log}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Project"
|
||||
// parent_name_extractor: "projects/{project}"
|
||||
// }
|
||||
// name_descriptor: {
|
||||
// pattern: "folders/{folder}/logs/{log}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Folder"
|
||||
// parent_name_extractor: "folders/{folder}"
|
||||
// }
|
||||
// name_descriptor: {
|
||||
// pattern: "organizations/{organization}/logs/{log}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Organization"
|
||||
// parent_name_extractor: "organizations/{organization}"
|
||||
// }
|
||||
// name_descriptor: {
|
||||
// pattern: "billingAccounts/{billing_account}/logs/{log}"
|
||||
// parent_type: "billing.googleapis.com/BillingAccount"
|
||||
// parent_name_extractor: "billingAccounts/{billing_account}"
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
//
|
||||
// The ResourceDescriptor Yaml config will look like:
|
||||
//
|
||||
// resources:
|
||||
// - type: 'logging.googleapis.com/LogEntry'
|
||||
// name_descriptor:
|
||||
// - pattern: "projects/{project}/logs/{log}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Project"
|
||||
// parent_name_extractor: "projects/{project}"
|
||||
// - pattern: "folders/{folder}/logs/{log}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Folder"
|
||||
// parent_name_extractor: "folders/{folder}"
|
||||
// - pattern: "organizations/{organization}/logs/{log}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Organization"
|
||||
// parent_name_extractor: "organizations/{organization}"
|
||||
// - pattern: "billingAccounts/{billing_account}/logs/{log}"
|
||||
// parent_type: "billing.googleapis.com/BillingAccount"
|
||||
// parent_name_extractor: "billingAccounts/{billing_account}"
|
||||
//
|
||||
// For flexible resources, the resource name doesn't contain parent names, but
|
||||
// the resource itself has parents for policy evaluation.
|
||||
//
|
||||
// Example:
|
||||
//
|
||||
// message Shelf {
|
||||
// option (google.api.resource) = {
|
||||
// type: "library.googleapis.com/Shelf"
|
||||
// name_descriptor: {
|
||||
// pattern: "shelves/{shelf}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Project"
|
||||
// }
|
||||
// name_descriptor: {
|
||||
// pattern: "shelves/{shelf}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Folder"
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
//
|
||||
// The ResourceDescriptor Yaml config will look like:
|
||||
//
|
||||
// resources:
|
||||
// - type: 'library.googleapis.com/Shelf'
|
||||
// name_descriptor:
|
||||
// - pattern: "shelves/{shelf}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Project"
|
||||
// - pattern: "shelves/{shelf}"
|
||||
// parent_type: "cloudresourcemanager.googleapis.com/Folder"
|
||||
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'. 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;
|
||||
}
|
||||
Generated
Vendored
+100
@@ -0,0 +1,100 @@
|
||||
// Copyright 2019 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.firestore.admin.v1;
|
||||
|
||||
import "google/api/resource.proto";
|
||||
import "google/firestore/admin/v1/index.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.Admin.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/admin/v1;admin";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "FieldProto";
|
||||
option java_package = "com.google.firestore.admin.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::Admin::V1";
|
||||
|
||||
// Represents a single field in the database.
|
||||
//
|
||||
// Fields are grouped by their "Collection Group", which represent all
|
||||
// collections in the database with the same id.
|
||||
message Field {
|
||||
option (google.api.resource) = {
|
||||
type: "firestore.googleapis.com/Field"
|
||||
pattern: "projects/{project}/databases/{database}/collectionGroups/{collection}/fields/{field}"
|
||||
};
|
||||
|
||||
// The index configuration for this field.
|
||||
message IndexConfig {
|
||||
// The indexes supported for this field.
|
||||
repeated Index indexes = 1;
|
||||
|
||||
// Output only. When true, the `Field`'s index configuration is set from the
|
||||
// configuration specified by the `ancestor_field`.
|
||||
// When false, the `Field`'s index configuration is defined explicitly.
|
||||
bool uses_ancestor_config = 2;
|
||||
|
||||
// Output only. Specifies the resource name of the `Field` from which this field's
|
||||
// index configuration is set (when `uses_ancestor_config` is true),
|
||||
// or from which it *would* be set if this field had no index configuration
|
||||
// (when `uses_ancestor_config` is false).
|
||||
string ancestor_field = 3;
|
||||
|
||||
// Output only
|
||||
// When true, the `Field`'s index configuration is in the process of being
|
||||
// reverted. Once complete, the index config will transition to the same
|
||||
// state as the field specified by `ancestor_field`, at which point
|
||||
// `uses_ancestor_config` will be `true` and `reverting` will be `false`.
|
||||
bool reverting = 4;
|
||||
}
|
||||
|
||||
// A field name of the form
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/fields/{field_path}`
|
||||
//
|
||||
// A field path may be a simple field name, e.g. `address` or a path to fields
|
||||
// within map_value , e.g. `address.city`,
|
||||
// or a special field path. The only valid special field is `*`, which
|
||||
// represents any field.
|
||||
//
|
||||
// Field paths may be quoted using ` (backtick). The only character that needs
|
||||
// to be escaped within a quoted field path is the backtick character itself,
|
||||
// escaped using a backslash. Special characters in field paths that
|
||||
// must be quoted include: `*`, `.`,
|
||||
// ``` (backtick), `[`, `]`, as well as any ascii symbolic characters.
|
||||
//
|
||||
// Examples:
|
||||
// (Note: Comments here are written in markdown syntax, so there is an
|
||||
// additional layer of backticks to represent a code block)
|
||||
// `\`address.city\`` represents a field named `address.city`, not the map key
|
||||
// `city` in the field `address`.
|
||||
// `\`*\`` represents a field named `*`, not any field.
|
||||
//
|
||||
// A special `Field` contains the default indexing settings for all fields.
|
||||
// This field's resource name is:
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/__default__/fields/*`
|
||||
// Indexes defined on this `Field` will be applied to all fields which do not
|
||||
// have their own `Field` index configuration.
|
||||
string name = 1;
|
||||
|
||||
// The index configuration for this field. If unset, field indexing will
|
||||
// revert to the configuration defined by the `ancestor_field`. To
|
||||
// explicitly remove all indexes for this field, specify an index config
|
||||
// with an empty list of indexes.
|
||||
IndexConfig index_config = 2;
|
||||
}
|
||||
Generated
Vendored
+355
@@ -0,0 +1,355 @@
|
||||
// Copyright 2019 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.firestore.admin.v1;
|
||||
|
||||
import "google/api/annotations.proto";
|
||||
import "google/api/client.proto";
|
||||
import "google/api/field_behavior.proto";
|
||||
import "google/api/resource.proto";
|
||||
import "google/firestore/admin/v1/field.proto";
|
||||
import "google/firestore/admin/v1/index.proto";
|
||||
import "google/longrunning/operations.proto";
|
||||
import "google/protobuf/empty.proto";
|
||||
import "google/protobuf/field_mask.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.Admin.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/admin/v1;admin";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "FirestoreAdminProto";
|
||||
option java_package = "com.google.firestore.admin.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::Admin::V1";
|
||||
option (google.api.resource_definition) = {
|
||||
type: "firestore.googleapis.com/Database"
|
||||
pattern: "projects/{project}/databases/{database}"
|
||||
};
|
||||
option (google.api.resource_definition) = {
|
||||
type: "firestore.googleapis.com/CollectionGroup"
|
||||
pattern: "projects/{project}/databases/{database}/collectionGroups/{collection}"
|
||||
};
|
||||
|
||||
// Operations are created by service `FirestoreAdmin`, but are accessed via
|
||||
// service `google.longrunning.Operations`.
|
||||
service FirestoreAdmin {
|
||||
option (google.api.default_host) = "firestore.googleapis.com";
|
||||
option (google.api.oauth_scopes) =
|
||||
"https://www.googleapis.com/auth/cloud-platform,"
|
||||
"https://www.googleapis.com/auth/datastore";
|
||||
|
||||
// Creates a composite index. This returns a [google.longrunning.Operation][google.longrunning.Operation]
|
||||
// which may be used to track the status of the creation. The metadata for
|
||||
// the operation will be the type [IndexOperationMetadata][google.firestore.admin.v1.IndexOperationMetadata].
|
||||
rpc CreateIndex(CreateIndexRequest) returns (google.longrunning.Operation) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{parent=projects/*/databases/*/collectionGroups/*}/indexes"
|
||||
body: "index"
|
||||
};
|
||||
option (google.api.method_signature) = "parent,index";
|
||||
option (google.longrunning.operation_info) = {
|
||||
response_type: "Index"
|
||||
metadata_type: "IndexOperationMetadata"
|
||||
};
|
||||
}
|
||||
|
||||
// Lists composite indexes.
|
||||
rpc ListIndexes(ListIndexesRequest) returns (ListIndexesResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1/{parent=projects/*/databases/*/collectionGroups/*}/indexes"
|
||||
};
|
||||
option (google.api.method_signature) = "parent";
|
||||
}
|
||||
|
||||
// Gets a composite index.
|
||||
rpc GetIndex(GetIndexRequest) returns (Index) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1/{name=projects/*/databases/*/collectionGroups/*/indexes/*}"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
}
|
||||
|
||||
// Deletes a composite index.
|
||||
rpc DeleteIndex(DeleteIndexRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
delete: "/v1/{name=projects/*/databases/*/collectionGroups/*/indexes/*}"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
}
|
||||
|
||||
// Gets the metadata and configuration for a Field.
|
||||
rpc GetField(GetFieldRequest) returns (Field) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1/{name=projects/*/databases/*/collectionGroups/*/fields/*}"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
}
|
||||
|
||||
// Updates a field configuration. Currently, field updates apply only to
|
||||
// single field index configuration. However, calls to
|
||||
// [FirestoreAdmin.UpdateField][google.firestore.admin.v1.FirestoreAdmin.UpdateField] should provide a field mask to avoid
|
||||
// changing any configuration that the caller isn't aware of. The field mask
|
||||
// should be specified as: `{ paths: "index_config" }`.
|
||||
//
|
||||
// This call returns a [google.longrunning.Operation][google.longrunning.Operation] which may be used to
|
||||
// track the status of the field update. The metadata for
|
||||
// the operation will be the type [FieldOperationMetadata][google.firestore.admin.v1.FieldOperationMetadata].
|
||||
//
|
||||
// To configure the default field settings for the database, use
|
||||
// the special `Field` with resource name:
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/__default__/fields/*`.
|
||||
rpc UpdateField(UpdateFieldRequest) returns (google.longrunning.Operation) {
|
||||
option (google.api.http) = {
|
||||
patch: "/v1/{field.name=projects/*/databases/*/collectionGroups/*/fields/*}"
|
||||
body: "field"
|
||||
};
|
||||
option (google.api.method_signature) = "field";
|
||||
option (google.longrunning.operation_info) = {
|
||||
response_type: "Field"
|
||||
metadata_type: "FieldOperationMetadata"
|
||||
};
|
||||
}
|
||||
|
||||
// Lists the field configuration and metadata for this database.
|
||||
//
|
||||
// Currently, [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields] only supports listing fields
|
||||
// that have been explicitly overridden. To issue this query, call
|
||||
// [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields] with the filter set to
|
||||
// `indexConfig.usesAncestorConfig:false`.
|
||||
rpc ListFields(ListFieldsRequest) returns (ListFieldsResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1/{parent=projects/*/databases/*/collectionGroups/*}/fields"
|
||||
};
|
||||
option (google.api.method_signature) = "parent";
|
||||
}
|
||||
|
||||
// Exports a copy of all or a subset of documents from Google Cloud Firestore
|
||||
// to another storage system, such as Google Cloud Storage. Recent updates to
|
||||
// documents may not be reflected in the export. The export occurs in the
|
||||
// background and its progress can be monitored and managed via the
|
||||
// Operation resource that is created. The output of an export may only be
|
||||
// used once the associated operation is done. If an export operation is
|
||||
// cancelled before completion it may leave partial data behind in Google
|
||||
// Cloud Storage.
|
||||
rpc ExportDocuments(ExportDocumentsRequest) returns (google.longrunning.Operation) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{name=projects/*/databases/*}:exportDocuments"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
option (google.longrunning.operation_info) = {
|
||||
response_type: "ExportDocumentsResponse"
|
||||
metadata_type: "ExportDocumentsMetadata"
|
||||
};
|
||||
}
|
||||
|
||||
// Imports documents into Google Cloud Firestore. Existing documents with the
|
||||
// same name are overwritten. The import occurs in the background and its
|
||||
// progress can be monitored and managed via the Operation resource that is
|
||||
// created. If an ImportDocuments operation is cancelled, it is possible
|
||||
// that a subset of the data has already been imported to Cloud Firestore.
|
||||
rpc ImportDocuments(ImportDocumentsRequest) returns (google.longrunning.Operation) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{name=projects/*/databases/*}:importDocuments"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
option (google.longrunning.operation_info) = {
|
||||
response_type: "google.protobuf.Empty"
|
||||
metadata_type: "ImportDocumentsMetadata"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.CreateIndex][google.firestore.admin.v1.FirestoreAdmin.CreateIndex].
|
||||
message CreateIndexRequest {
|
||||
// Required. A parent name of the form
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`
|
||||
string parent = 1 [
|
||||
(google.api.field_behavior) = REQUIRED,
|
||||
(google.api.resource_reference) = {
|
||||
type: "firestore.googleapis.com/CollectionGroup"
|
||||
}
|
||||
];
|
||||
|
||||
// Required. The composite index to create.
|
||||
Index index = 2 [(google.api.field_behavior) = REQUIRED];
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.ListIndexes][google.firestore.admin.v1.FirestoreAdmin.ListIndexes].
|
||||
message ListIndexesRequest {
|
||||
// Required. A parent name of the form
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`
|
||||
string parent = 1 [
|
||||
(google.api.field_behavior) = REQUIRED,
|
||||
(google.api.resource_reference) = {
|
||||
type: "firestore.googleapis.com/CollectionGroup"
|
||||
}
|
||||
];
|
||||
|
||||
// The filter to apply to list results.
|
||||
string filter = 2;
|
||||
|
||||
// The number of results to return.
|
||||
int32 page_size = 3;
|
||||
|
||||
// A page token, returned from a previous call to
|
||||
// [FirestoreAdmin.ListIndexes][google.firestore.admin.v1.FirestoreAdmin.ListIndexes], that may be used to get the next
|
||||
// page of results.
|
||||
string page_token = 4;
|
||||
}
|
||||
|
||||
// The response for [FirestoreAdmin.ListIndexes][google.firestore.admin.v1.FirestoreAdmin.ListIndexes].
|
||||
message ListIndexesResponse {
|
||||
// The requested indexes.
|
||||
repeated Index indexes = 1;
|
||||
|
||||
// A page token that may be used to request another page of results. If blank,
|
||||
// this is the last page.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.GetIndex][google.firestore.admin.v1.FirestoreAdmin.GetIndex].
|
||||
message GetIndexRequest {
|
||||
// Required. A name of the form
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/indexes/{index_id}`
|
||||
string name = 1 [
|
||||
(google.api.field_behavior) = REQUIRED,
|
||||
(google.api.resource_reference) = {
|
||||
type: "firestore.googleapis.com/Index"
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.DeleteIndex][google.firestore.admin.v1.FirestoreAdmin.DeleteIndex].
|
||||
message DeleteIndexRequest {
|
||||
// Required. A name of the form
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/indexes/{index_id}`
|
||||
string name = 1 [
|
||||
(google.api.field_behavior) = REQUIRED,
|
||||
(google.api.resource_reference) = {
|
||||
type: "firestore.googleapis.com/Index"
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.UpdateField][google.firestore.admin.v1.FirestoreAdmin.UpdateField].
|
||||
message UpdateFieldRequest {
|
||||
// Required. The field to be updated.
|
||||
Field field = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// A mask, relative to the field. If specified, only configuration specified
|
||||
// by this field_mask will be updated in the field.
|
||||
google.protobuf.FieldMask update_mask = 2;
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.GetField][google.firestore.admin.v1.FirestoreAdmin.GetField].
|
||||
message GetFieldRequest {
|
||||
// Required. A name of the form
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/fields/{field_id}`
|
||||
string name = 1 [
|
||||
(google.api.field_behavior) = REQUIRED,
|
||||
(google.api.resource_reference) = {
|
||||
type: "firestore.googleapis.com/Field"
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields].
|
||||
message ListFieldsRequest {
|
||||
// Required. A parent name of the form
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`
|
||||
string parent = 1 [
|
||||
(google.api.field_behavior) = REQUIRED,
|
||||
(google.api.resource_reference) = {
|
||||
type: "firestore.googleapis.com/CollectionGroup"
|
||||
}
|
||||
];
|
||||
|
||||
// The filter to apply to list results. Currently,
|
||||
// [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields] only supports listing fields
|
||||
// that have been explicitly overridden. To issue this query, call
|
||||
// [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields] with the filter set to
|
||||
// `indexConfig.usesAncestorConfig:false`.
|
||||
string filter = 2;
|
||||
|
||||
// The number of results to return.
|
||||
int32 page_size = 3;
|
||||
|
||||
// A page token, returned from a previous call to
|
||||
// [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields], that may be used to get the next
|
||||
// page of results.
|
||||
string page_token = 4;
|
||||
}
|
||||
|
||||
// The response for [FirestoreAdmin.ListFields][google.firestore.admin.v1.FirestoreAdmin.ListFields].
|
||||
message ListFieldsResponse {
|
||||
// The requested fields.
|
||||
repeated Field fields = 1;
|
||||
|
||||
// A page token that may be used to request another page of results. If blank,
|
||||
// this is the last page.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.ExportDocuments][google.firestore.admin.v1.FirestoreAdmin.ExportDocuments].
|
||||
message ExportDocumentsRequest {
|
||||
// Required. Database to export. Should be of the form:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string name = 1 [
|
||||
(google.api.field_behavior) = REQUIRED,
|
||||
(google.api.resource_reference) = {
|
||||
type: "firestore.googleapis.com/Database"
|
||||
}
|
||||
];
|
||||
|
||||
// Which collection ids to export. Unspecified means all collections.
|
||||
repeated string collection_ids = 2;
|
||||
|
||||
// The output URI. Currently only supports Google Cloud Storage URIs of the
|
||||
// form: `gs://BUCKET_NAME[/NAMESPACE_PATH]`, where `BUCKET_NAME` is the name
|
||||
// of the Google Cloud Storage bucket and `NAMESPACE_PATH` is an optional
|
||||
// Google Cloud Storage namespace path. When
|
||||
// choosing a name, be sure to consider Google Cloud Storage naming
|
||||
// guidelines: https://cloud.google.com/storage/docs/naming.
|
||||
// If the URI is a bucket (without a namespace path), a prefix will be
|
||||
// generated based on the start time.
|
||||
string output_uri_prefix = 3;
|
||||
}
|
||||
|
||||
// The request for [FirestoreAdmin.ImportDocuments][google.firestore.admin.v1.FirestoreAdmin.ImportDocuments].
|
||||
message ImportDocumentsRequest {
|
||||
// Required. Database to import into. Should be of the form:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string name = 1 [
|
||||
(google.api.field_behavior) = REQUIRED,
|
||||
(google.api.resource_reference) = {
|
||||
type: "firestore.googleapis.com/Database"
|
||||
}
|
||||
];
|
||||
|
||||
// Which collection ids to import. Unspecified means all collections included
|
||||
// in the import.
|
||||
repeated string collection_ids = 2;
|
||||
|
||||
// Location of the exported files.
|
||||
// This must match the output_uri_prefix of an ExportDocumentsResponse from
|
||||
// an export that has completed successfully.
|
||||
// See:
|
||||
// [google.firestore.admin.v1.ExportDocumentsResponse.output_uri_prefix][google.firestore.admin.v1.ExportDocumentsResponse.output_uri_prefix].
|
||||
string input_uri_prefix = 3;
|
||||
}
|
||||
Generated
Vendored
+158
@@ -0,0 +1,158 @@
|
||||
// Copyright 2019 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.firestore.admin.v1;
|
||||
|
||||
import "google/api/resource.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.Admin.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/admin/v1;admin";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "IndexProto";
|
||||
option java_package = "com.google.firestore.admin.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::Admin::V1";
|
||||
|
||||
// Cloud Firestore indexes enable simple and complex queries against
|
||||
// documents in a database.
|
||||
message Index {
|
||||
option (google.api.resource) = {
|
||||
type: "firestore.googleapis.com/Index"
|
||||
pattern: "projects/{project}/databases/{database}/collectionGroups/{collection}/indexes/{index}"
|
||||
};
|
||||
|
||||
// A field in an index.
|
||||
// The field_path describes which field is indexed, the value_mode describes
|
||||
// how the field value is indexed.
|
||||
message IndexField {
|
||||
// The supported orderings.
|
||||
enum Order {
|
||||
// The ordering is unspecified. Not a valid option.
|
||||
ORDER_UNSPECIFIED = 0;
|
||||
|
||||
// The field is ordered by ascending field value.
|
||||
ASCENDING = 1;
|
||||
|
||||
// The field is ordered by descending field value.
|
||||
DESCENDING = 2;
|
||||
}
|
||||
|
||||
// The supported array value configurations.
|
||||
enum ArrayConfig {
|
||||
// The index does not support additional array queries.
|
||||
ARRAY_CONFIG_UNSPECIFIED = 0;
|
||||
|
||||
// The index supports array containment queries.
|
||||
CONTAINS = 1;
|
||||
}
|
||||
|
||||
// Can be __name__.
|
||||
// For single field indexes, this must match the name of the field or may
|
||||
// be omitted.
|
||||
string field_path = 1;
|
||||
|
||||
// How the field value is indexed.
|
||||
oneof value_mode {
|
||||
// Indicates that this field supports ordering by the specified order or
|
||||
// comparing using =, <, <=, >, >=.
|
||||
Order order = 2;
|
||||
|
||||
// Indicates that this field supports operations on `array_value`s.
|
||||
ArrayConfig array_config = 3;
|
||||
}
|
||||
}
|
||||
|
||||
// Query Scope defines the scope at which a query is run. This is specified on
|
||||
// a StructuredQuery's `from` field.
|
||||
enum QueryScope {
|
||||
// The query scope is unspecified. Not a valid option.
|
||||
QUERY_SCOPE_UNSPECIFIED = 0;
|
||||
|
||||
// Indexes with a collection query scope specified allow queries
|
||||
// against a collection that is the child of a specific document, specified
|
||||
// at query time, and that has the collection id specified by the index.
|
||||
COLLECTION = 1;
|
||||
|
||||
// Indexes with a collection group query scope specified allow queries
|
||||
// against all collections that has the collection id specified by the
|
||||
// index.
|
||||
COLLECTION_GROUP = 2;
|
||||
}
|
||||
|
||||
// The state of an index. During index creation, an index will be in the
|
||||
// `CREATING` state. If the index is created successfully, it will transition
|
||||
// to the `READY` state. If the index creation encounters a problem, the index
|
||||
// will transition to the `NEEDS_REPAIR` state.
|
||||
enum State {
|
||||
// The state is unspecified.
|
||||
STATE_UNSPECIFIED = 0;
|
||||
|
||||
// The index is being created.
|
||||
// There is an active long-running operation for the index.
|
||||
// The index is updated when writing a document.
|
||||
// Some index data may exist.
|
||||
CREATING = 1;
|
||||
|
||||
// The index is ready to be used.
|
||||
// The index is updated when writing a document.
|
||||
// The index is fully populated from all stored documents it applies to.
|
||||
READY = 2;
|
||||
|
||||
// The index was being created, but something went wrong.
|
||||
// There is no active long-running operation for the index,
|
||||
// and the most recently finished long-running operation failed.
|
||||
// The index is not updated when writing a document.
|
||||
// Some index data may exist.
|
||||
// Use the google.longrunning.Operations API to determine why the operation
|
||||
// that last attempted to create this index failed, then re-create the
|
||||
// index.
|
||||
NEEDS_REPAIR = 3;
|
||||
}
|
||||
|
||||
// Output only. A server defined name for this index.
|
||||
// The form of this name for composite indexes will be:
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/indexes/{composite_index_id}`
|
||||
// For single field indexes, this field will be empty.
|
||||
string name = 1;
|
||||
|
||||
// Indexes with a collection query scope specified allow queries
|
||||
// against a collection that is the child of a specific document, specified at
|
||||
// query time, and that has the same collection id.
|
||||
//
|
||||
// Indexes with a collection group query scope specified allow queries against
|
||||
// all collections descended from a specific document, specified at query
|
||||
// time, and that have the same collection id as this index.
|
||||
QueryScope query_scope = 2;
|
||||
|
||||
// The fields supported by this index.
|
||||
//
|
||||
// For composite indexes, this is always 2 or more fields.
|
||||
// The last field entry is always for the field path `__name__`. If, on
|
||||
// creation, `__name__` was not specified as the last field, it will be added
|
||||
// automatically with the same direction as that of the last field defined. If
|
||||
// the final field in a composite index is not directional, the `__name__`
|
||||
// will be ordered ASCENDING (unless explicitly specified).
|
||||
//
|
||||
// For single field indexes, this will always be exactly one entry with a
|
||||
// field path equal to the field path of the associated field.
|
||||
repeated IndexField fields = 3;
|
||||
|
||||
// Output only. The serving state of the index.
|
||||
State state = 4;
|
||||
}
|
||||
Generated
Vendored
+35
@@ -0,0 +1,35 @@
|
||||
// Copyright 2019 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.firestore.admin.v1;
|
||||
|
||||
import "google/type/latlng.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.Admin.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/admin/v1;admin";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "LocationProto";
|
||||
option java_package = "com.google.firestore.admin.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::Admin::V1";
|
||||
|
||||
// The metadata message for [google.cloud.location.Location.metadata][google.cloud.location.Location.metadata].
|
||||
message LocationMetadata {
|
||||
|
||||
}
|
||||
Generated
Vendored
+204
@@ -0,0 +1,204 @@
|
||||
// Copyright 2019 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.firestore.admin.v1;
|
||||
|
||||
import "google/firestore/admin/v1/index.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.Admin.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/admin/v1;admin";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "OperationProto";
|
||||
option java_package = "com.google.firestore.admin.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::Admin::V1";
|
||||
|
||||
// Metadata for [google.longrunning.Operation][google.longrunning.Operation] results from
|
||||
// [FirestoreAdmin.CreateIndex][google.firestore.admin.v1.FirestoreAdmin.CreateIndex].
|
||||
message IndexOperationMetadata {
|
||||
// The time this operation started.
|
||||
google.protobuf.Timestamp start_time = 1;
|
||||
|
||||
// The time this operation completed. Will be unset if operation still in
|
||||
// progress.
|
||||
google.protobuf.Timestamp end_time = 2;
|
||||
|
||||
// The index resource that this operation is acting on. For example:
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/indexes/{index_id}`
|
||||
string index = 3;
|
||||
|
||||
// The state of the operation.
|
||||
OperationState state = 4;
|
||||
|
||||
// The progress, in documents, of this operation.
|
||||
Progress progress_documents = 5;
|
||||
|
||||
// The progress, in bytes, of this operation.
|
||||
Progress progress_bytes = 6;
|
||||
}
|
||||
|
||||
// Metadata for [google.longrunning.Operation][google.longrunning.Operation] results from
|
||||
// [FirestoreAdmin.UpdateField][google.firestore.admin.v1.FirestoreAdmin.UpdateField].
|
||||
message FieldOperationMetadata {
|
||||
// Information about an index configuration change.
|
||||
message IndexConfigDelta {
|
||||
// Specifies how the index is changing.
|
||||
enum ChangeType {
|
||||
// The type of change is not specified or known.
|
||||
CHANGE_TYPE_UNSPECIFIED = 0;
|
||||
|
||||
// The single field index is being added.
|
||||
ADD = 1;
|
||||
|
||||
// The single field index is being removed.
|
||||
REMOVE = 2;
|
||||
}
|
||||
|
||||
// Specifies how the index is changing.
|
||||
ChangeType change_type = 1;
|
||||
|
||||
// The index being changed.
|
||||
Index index = 2;
|
||||
}
|
||||
|
||||
// The time this operation started.
|
||||
google.protobuf.Timestamp start_time = 1;
|
||||
|
||||
// The time this operation completed. Will be unset if operation still in
|
||||
// progress.
|
||||
google.protobuf.Timestamp end_time = 2;
|
||||
|
||||
// The field resource that this operation is acting on. For example:
|
||||
// `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/fields/{field_path}`
|
||||
string field = 3;
|
||||
|
||||
// A list of [IndexConfigDelta][google.firestore.admin.v1.FieldOperationMetadata.IndexConfigDelta], which describe the intent of this
|
||||
// operation.
|
||||
repeated IndexConfigDelta index_config_deltas = 4;
|
||||
|
||||
// The state of the operation.
|
||||
OperationState state = 5;
|
||||
|
||||
// The progress, in documents, of this operation.
|
||||
Progress progress_documents = 6;
|
||||
|
||||
// The progress, in bytes, of this operation.
|
||||
Progress progress_bytes = 7;
|
||||
}
|
||||
|
||||
// Metadata for [google.longrunning.Operation][google.longrunning.Operation] results from
|
||||
// [FirestoreAdmin.ExportDocuments][google.firestore.admin.v1.FirestoreAdmin.ExportDocuments].
|
||||
message ExportDocumentsMetadata {
|
||||
// The time this operation started.
|
||||
google.protobuf.Timestamp start_time = 1;
|
||||
|
||||
// The time this operation completed. Will be unset if operation still in
|
||||
// progress.
|
||||
google.protobuf.Timestamp end_time = 2;
|
||||
|
||||
// The state of the export operation.
|
||||
OperationState operation_state = 3;
|
||||
|
||||
// The progress, in documents, of this operation.
|
||||
Progress progress_documents = 4;
|
||||
|
||||
// The progress, in bytes, of this operation.
|
||||
Progress progress_bytes = 5;
|
||||
|
||||
// Which collection ids are being exported.
|
||||
repeated string collection_ids = 6;
|
||||
|
||||
// Where the entities are being exported to.
|
||||
string output_uri_prefix = 7;
|
||||
}
|
||||
|
||||
// Metadata for [google.longrunning.Operation][google.longrunning.Operation] results from
|
||||
// [FirestoreAdmin.ImportDocuments][google.firestore.admin.v1.FirestoreAdmin.ImportDocuments].
|
||||
message ImportDocumentsMetadata {
|
||||
// The time this operation started.
|
||||
google.protobuf.Timestamp start_time = 1;
|
||||
|
||||
// The time this operation completed. Will be unset if operation still in
|
||||
// progress.
|
||||
google.protobuf.Timestamp end_time = 2;
|
||||
|
||||
// The state of the import operation.
|
||||
OperationState operation_state = 3;
|
||||
|
||||
// The progress, in documents, of this operation.
|
||||
Progress progress_documents = 4;
|
||||
|
||||
// The progress, in bytes, of this operation.
|
||||
Progress progress_bytes = 5;
|
||||
|
||||
// Which collection ids are being imported.
|
||||
repeated string collection_ids = 6;
|
||||
|
||||
// The location of the documents being imported.
|
||||
string input_uri_prefix = 7;
|
||||
}
|
||||
|
||||
// Returned in the [google.longrunning.Operation][google.longrunning.Operation] response field.
|
||||
message ExportDocumentsResponse {
|
||||
// Location of the output files. This can be used to begin an import
|
||||
// into Cloud Firestore (this project or another project) after the operation
|
||||
// completes successfully.
|
||||
string output_uri_prefix = 1;
|
||||
}
|
||||
|
||||
// Describes the progress of the operation.
|
||||
// Unit of work is generic and must be interpreted based on where [Progress][google.firestore.admin.v1.Progress]
|
||||
// is used.
|
||||
message Progress {
|
||||
// The amount of work estimated.
|
||||
int64 estimated_work = 1;
|
||||
|
||||
// The amount of work completed.
|
||||
int64 completed_work = 2;
|
||||
}
|
||||
|
||||
// Describes the state of the operation.
|
||||
enum OperationState {
|
||||
// Unspecified.
|
||||
OPERATION_STATE_UNSPECIFIED = 0;
|
||||
|
||||
// Request is being prepared for processing.
|
||||
INITIALIZING = 1;
|
||||
|
||||
// Request is actively being processed.
|
||||
PROCESSING = 2;
|
||||
|
||||
// Request is in the process of being cancelled after user called
|
||||
// google.longrunning.Operations.CancelOperation on the operation.
|
||||
CANCELLING = 3;
|
||||
|
||||
// Request has been processed and is in its finalization stage.
|
||||
FINALIZING = 4;
|
||||
|
||||
// Request has completed successfully.
|
||||
SUCCESSFUL = 5;
|
||||
|
||||
// Request has finished being processed, but encountered an error.
|
||||
FAILED = 6;
|
||||
|
||||
// Request has finished being cancelled after user called
|
||||
// google.longrunning.Operations.CancelOperation.
|
||||
CANCELLED = 7;
|
||||
}
|
||||
Generated
Vendored
+83
@@ -0,0 +1,83 @@
|
||||
// Copyright 2021 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.firestore.v1;
|
||||
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "CommonProto";
|
||||
option java_package = "com.google.firestore.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1";
|
||||
|
||||
// A set of field paths on a document.
|
||||
// Used to restrict a get or update operation on a document to a subset of its
|
||||
// fields.
|
||||
// This is different from standard field masks, as this is always scoped to a
|
||||
// [Document][google.firestore.v1.Document], and takes in account the dynamic nature of [Value][google.firestore.v1.Value].
|
||||
message DocumentMask {
|
||||
// The list of field paths in the mask. See [Document.fields][google.firestore.v1.Document.fields] for a field
|
||||
// path syntax reference.
|
||||
repeated string field_paths = 1;
|
||||
}
|
||||
|
||||
// A precondition on a document, used for conditional operations.
|
||||
message Precondition {
|
||||
// The type of precondition.
|
||||
oneof condition_type {
|
||||
// When set to `true`, the target document must exist.
|
||||
// When set to `false`, the target document must not exist.
|
||||
bool exists = 1;
|
||||
|
||||
// When set, the target document must exist and have been last updated at
|
||||
// that time.
|
||||
google.protobuf.Timestamp update_time = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// Options for creating a new transaction.
|
||||
message TransactionOptions {
|
||||
// Options for a transaction that can be used to read and write documents.
|
||||
message ReadWrite {
|
||||
// An optional transaction to retry.
|
||||
bytes retry_transaction = 1;
|
||||
}
|
||||
|
||||
// Options for a transaction that can only be used to read documents.
|
||||
message ReadOnly {
|
||||
// The consistency mode for this transaction. If not set, defaults to strong
|
||||
// consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads documents at the given time.
|
||||
// This may not be older than 60 seconds.
|
||||
google.protobuf.Timestamp read_time = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// The mode of the transaction.
|
||||
oneof mode {
|
||||
// The transaction can only be used for read operations.
|
||||
ReadOnly read_only = 2;
|
||||
|
||||
// The transaction can be used for both read and write operations.
|
||||
ReadWrite read_write = 3;
|
||||
}
|
||||
}
|
||||
Generated
Vendored
+150
@@ -0,0 +1,150 @@
|
||||
// Copyright 2021 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.firestore.v1;
|
||||
|
||||
import "google/protobuf/struct.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/type/latlng.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "DocumentProto";
|
||||
option java_package = "com.google.firestore.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1";
|
||||
|
||||
// A Firestore document.
|
||||
//
|
||||
// Must not exceed 1 MiB - 4 bytes.
|
||||
message Document {
|
||||
// The resource name of the document, for example
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string name = 1;
|
||||
|
||||
// The document's fields.
|
||||
//
|
||||
// The map keys represent field names.
|
||||
//
|
||||
// A simple field name contains only characters `a` to `z`, `A` to `Z`,
|
||||
// `0` to `9`, or `_`, and must not start with `0` to `9`. For example,
|
||||
// `foo_bar_17`.
|
||||
//
|
||||
// Field names matching the regular expression `__.*__` are reserved. Reserved
|
||||
// field names are forbidden except in certain documented contexts. The map
|
||||
// keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be
|
||||
// empty.
|
||||
//
|
||||
// Field paths may be used in other contexts to refer to structured fields
|
||||
// defined here. For `map_value`, the field path is represented by the simple
|
||||
// or quoted field names of the containing fields, delimited by `.`. For
|
||||
// example, the structured field
|
||||
// `"foo" : { map_value: { "x&y" : { string_value: "hello" }}}` would be
|
||||
// represented by the field path `foo.x&y`.
|
||||
//
|
||||
// Within a field path, a quoted field name starts and ends with `` ` `` and
|
||||
// may contain any character. Some characters, including `` ` ``, must be
|
||||
// escaped using a `\`. For example, `` `x&y` `` represents `x&y` and
|
||||
// `` `bak\`tik` `` represents `` bak`tik ``.
|
||||
map<string, Value> fields = 2;
|
||||
|
||||
// Output only. The time at which the document was created.
|
||||
//
|
||||
// This value increases monotonically when a document is deleted then
|
||||
// recreated. It can also be compared to values from other documents and
|
||||
// the `read_time` of a query.
|
||||
google.protobuf.Timestamp create_time = 3;
|
||||
|
||||
// Output only. The time at which the document was last changed.
|
||||
//
|
||||
// This value is initially set to the `create_time` then increases
|
||||
// monotonically with each change to the document. It can also be
|
||||
// compared to values from other documents and the `read_time` of a query.
|
||||
google.protobuf.Timestamp update_time = 4;
|
||||
}
|
||||
|
||||
// A message that can hold any of the supported value types.
|
||||
message Value {
|
||||
// Must have a value set.
|
||||
oneof value_type {
|
||||
// A null value.
|
||||
google.protobuf.NullValue null_value = 11;
|
||||
|
||||
// A boolean value.
|
||||
bool boolean_value = 1;
|
||||
|
||||
// An integer value.
|
||||
int64 integer_value = 2;
|
||||
|
||||
// A double value.
|
||||
double double_value = 3;
|
||||
|
||||
// A timestamp value.
|
||||
//
|
||||
// Precise only to microseconds. When stored, any additional precision is
|
||||
// rounded down.
|
||||
google.protobuf.Timestamp timestamp_value = 10;
|
||||
|
||||
// A string value.
|
||||
//
|
||||
// The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes.
|
||||
// Only the first 1,500 bytes of the UTF-8 representation are considered by
|
||||
// queries.
|
||||
string string_value = 17;
|
||||
|
||||
// A bytes value.
|
||||
//
|
||||
// Must not exceed 1 MiB - 89 bytes.
|
||||
// Only the first 1,500 bytes are considered by queries.
|
||||
bytes bytes_value = 18;
|
||||
|
||||
// A reference to a document. For example:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string reference_value = 5;
|
||||
|
||||
// A geo point value representing a point on the surface of Earth.
|
||||
google.type.LatLng geo_point_value = 8;
|
||||
|
||||
// An array value.
|
||||
//
|
||||
// Cannot directly contain another array value, though can contain an
|
||||
// map which contains another array.
|
||||
ArrayValue array_value = 9;
|
||||
|
||||
// A map value.
|
||||
MapValue map_value = 6;
|
||||
}
|
||||
}
|
||||
|
||||
// An array value.
|
||||
message ArrayValue {
|
||||
// Values in the array.
|
||||
repeated Value values = 1;
|
||||
}
|
||||
|
||||
// A map value.
|
||||
message MapValue {
|
||||
// The map's fields.
|
||||
//
|
||||
// The map keys represent field names. Field names matching the regular
|
||||
// expression `__.*__` are reserved. Reserved field names are forbidden except
|
||||
// in certain documented contexts. The map keys, represented as UTF-8, must
|
||||
// not exceed 1,500 bytes and cannot be empty.
|
||||
map<string, Value> fields = 1;
|
||||
}
|
||||
Generated
Vendored
+900
@@ -0,0 +1,900 @@
|
||||
// Copyright 2021 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.firestore.v1;
|
||||
|
||||
import "google/api/annotations.proto";
|
||||
import "google/api/client.proto";
|
||||
import "google/api/field_behavior.proto";
|
||||
import "google/firestore/v1/common.proto";
|
||||
import "google/firestore/v1/document.proto";
|
||||
import "google/firestore/v1/query.proto";
|
||||
import "google/firestore/v1/write.proto";
|
||||
import "google/protobuf/empty.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/rpc/status.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "FirestoreProto";
|
||||
option java_package = "com.google.firestore.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1";
|
||||
|
||||
// Specification of the Firestore API.
|
||||
|
||||
// The Cloud Firestore service.
|
||||
//
|
||||
// Cloud Firestore is a fast, fully managed, serverless, cloud-native NoSQL
|
||||
// document database that simplifies storing, syncing, and querying data for
|
||||
// your mobile, web, and IoT apps at global scale. Its client libraries provide
|
||||
// live synchronization and offline support, while its security features and
|
||||
// integrations with Firebase and Google Cloud Platform (GCP) accelerate
|
||||
// building truly serverless apps.
|
||||
service Firestore {
|
||||
option (google.api.default_host) = "firestore.googleapis.com";
|
||||
option (google.api.oauth_scopes) =
|
||||
"https://www.googleapis.com/auth/cloud-platform,"
|
||||
"https://www.googleapis.com/auth/datastore";
|
||||
|
||||
// Gets a single document.
|
||||
rpc GetDocument(GetDocumentRequest) returns (Document) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1/{name=projects/*/databases/*/documents/*/**}"
|
||||
};
|
||||
}
|
||||
|
||||
// Lists documents.
|
||||
rpc ListDocuments(ListDocumentsRequest) returns (ListDocumentsResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1/{parent=projects/*/databases/*/documents/*/**}/{collection_id}"
|
||||
};
|
||||
}
|
||||
|
||||
// Updates or inserts a document.
|
||||
rpc UpdateDocument(UpdateDocumentRequest) returns (Document) {
|
||||
option (google.api.http) = {
|
||||
patch: "/v1/{document.name=projects/*/databases/*/documents/*/**}"
|
||||
body: "document"
|
||||
};
|
||||
option (google.api.method_signature) = "document,update_mask";
|
||||
}
|
||||
|
||||
// Deletes a document.
|
||||
rpc DeleteDocument(DeleteDocumentRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
delete: "/v1/{name=projects/*/databases/*/documents/*/**}"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
}
|
||||
|
||||
// Gets multiple documents.
|
||||
//
|
||||
// Documents returned by this method are not guaranteed to be returned in the
|
||||
// same order that they were requested.
|
||||
rpc BatchGetDocuments(BatchGetDocumentsRequest) returns (stream BatchGetDocumentsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{database=projects/*/databases/*}/documents:batchGet"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Starts a new transaction.
|
||||
rpc BeginTransaction(BeginTransactionRequest) returns (BeginTransactionResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{database=projects/*/databases/*}/documents:beginTransaction"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "database";
|
||||
}
|
||||
|
||||
// Commits a transaction, while optionally updating documents.
|
||||
rpc Commit(CommitRequest) returns (CommitResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{database=projects/*/databases/*}/documents:commit"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "database,writes";
|
||||
}
|
||||
|
||||
// Rolls back a transaction.
|
||||
rpc Rollback(RollbackRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{database=projects/*/databases/*}/documents:rollback"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "database,transaction";
|
||||
}
|
||||
|
||||
// Runs a query.
|
||||
rpc RunQuery(RunQueryRequest) returns (stream RunQueryResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{parent=projects/*/databases/*/documents}:runQuery"
|
||||
body: "*"
|
||||
additional_bindings {
|
||||
post: "/v1/{parent=projects/*/databases/*/documents/*/**}:runQuery"
|
||||
body: "*"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Partitions a query by returning partition cursors that can be used to run
|
||||
// the query in parallel. The returned partition cursors are split points that
|
||||
// can be used by RunQuery as starting/end points for the query results.
|
||||
rpc PartitionQuery(PartitionQueryRequest) returns (PartitionQueryResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{parent=projects/*/databases/*/documents}:partitionQuery"
|
||||
body: "*"
|
||||
additional_bindings {
|
||||
post: "/v1/{parent=projects/*/databases/*/documents/*/**}:partitionQuery"
|
||||
body: "*"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Streams batches of document updates and deletes, in order.
|
||||
rpc Write(stream WriteRequest) returns (stream WriteResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{database=projects/*/databases/*}/documents:write"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Listens to changes.
|
||||
rpc Listen(stream ListenRequest) returns (stream ListenResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{database=projects/*/databases/*}/documents:listen"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Lists all the collection IDs underneath a document.
|
||||
rpc ListCollectionIds(ListCollectionIdsRequest) returns (ListCollectionIdsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{parent=projects/*/databases/*/documents}:listCollectionIds"
|
||||
body: "*"
|
||||
additional_bindings {
|
||||
post: "/v1/{parent=projects/*/databases/*/documents/*/**}:listCollectionIds"
|
||||
body: "*"
|
||||
}
|
||||
};
|
||||
option (google.api.method_signature) = "parent";
|
||||
}
|
||||
|
||||
// Applies a batch of write operations.
|
||||
//
|
||||
// The BatchWrite method does not apply the write operations atomically
|
||||
// and can apply them out of order. Method does not allow more than one write
|
||||
// per document. Each write succeeds or fails independently. See the
|
||||
// [BatchWriteResponse][google.firestore.v1.BatchWriteResponse] for the success status of each write.
|
||||
//
|
||||
// If you require an atomically applied set of writes, use
|
||||
// [Commit][google.firestore.v1.Firestore.Commit] instead.
|
||||
rpc BatchWrite(BatchWriteRequest) returns (BatchWriteResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{database=projects/*/databases/*}/documents:batchWrite"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Creates a new document.
|
||||
rpc CreateDocument(CreateDocumentRequest) returns (Document) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{parent=projects/*/databases/*/documents/**}/{collection_id}"
|
||||
body: "document"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// The request for [Firestore.GetDocument][google.firestore.v1.Firestore.GetDocument].
|
||||
message GetDocumentRequest {
|
||||
// Required. The resource name of the Document to get. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string name = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If the document has a field that is not present in this mask, that field
|
||||
// will not be returned in the response.
|
||||
DocumentMask mask = 2;
|
||||
|
||||
// The consistency mode for this transaction.
|
||||
// If not set, defaults to strong consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads the document in a transaction.
|
||||
bytes transaction = 3;
|
||||
|
||||
// Reads the version of the document at the given time.
|
||||
// This may not be older than 270 seconds.
|
||||
google.protobuf.Timestamp read_time = 5;
|
||||
}
|
||||
}
|
||||
|
||||
// The request for [Firestore.ListDocuments][google.firestore.v1.Firestore.ListDocuments].
|
||||
message ListDocumentsRequest {
|
||||
// Required. The parent resource name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents` or
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// For example:
|
||||
// `projects/my-project/databases/my-database/documents` or
|
||||
// `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`
|
||||
// or `messages`.
|
||||
string collection_id = 2 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The maximum number of documents to return.
|
||||
int32 page_size = 3;
|
||||
|
||||
// The `next_page_token` value returned from a previous List request, if any.
|
||||
string page_token = 4;
|
||||
|
||||
// The order to sort results by. For example: `priority desc, name`.
|
||||
string order_by = 6;
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If a document has a field that is not present in this mask, that field
|
||||
// will not be returned in the response.
|
||||
DocumentMask mask = 7;
|
||||
|
||||
// The consistency mode for this transaction.
|
||||
// If not set, defaults to strong consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads documents in a transaction.
|
||||
bytes transaction = 8;
|
||||
|
||||
// Reads documents as they were at the given time.
|
||||
// This may not be older than 270 seconds.
|
||||
google.protobuf.Timestamp read_time = 10;
|
||||
}
|
||||
|
||||
// If the list should show missing documents. A missing document is a
|
||||
// document that does not exist but has sub-documents. These documents will
|
||||
// be returned with a key but will not have fields, [Document.create_time][google.firestore.v1.Document.create_time],
|
||||
// or [Document.update_time][google.firestore.v1.Document.update_time] set.
|
||||
//
|
||||
// Requests with `show_missing` may not specify `where` or
|
||||
// `order_by`.
|
||||
bool show_missing = 12;
|
||||
}
|
||||
|
||||
// The response for [Firestore.ListDocuments][google.firestore.v1.Firestore.ListDocuments].
|
||||
message ListDocumentsResponse {
|
||||
// The Documents found.
|
||||
repeated Document documents = 1;
|
||||
|
||||
// The next page token.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.CreateDocument][google.firestore.v1.Firestore.CreateDocument].
|
||||
message CreateDocumentRequest {
|
||||
// Required. The parent resource. For example:
|
||||
// `projects/{project_id}/databases/{database_id}/documents` or
|
||||
// `projects/{project_id}/databases/{database_id}/documents/chatrooms/{chatroom_id}`
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`.
|
||||
string collection_id = 2 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The client-assigned document ID to use for this document.
|
||||
//
|
||||
// Optional. If not specified, an ID will be assigned by the service.
|
||||
string document_id = 3;
|
||||
|
||||
// Required. The document to create. `name` must not be set.
|
||||
Document document = 4 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If the document has a field that is not present in this mask, that field
|
||||
// will not be returned in the response.
|
||||
DocumentMask mask = 5;
|
||||
}
|
||||
|
||||
// The request for [Firestore.UpdateDocument][google.firestore.v1.Firestore.UpdateDocument].
|
||||
message UpdateDocumentRequest {
|
||||
// Required. The updated document.
|
||||
// Creates the document if it does not already exist.
|
||||
Document document = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The fields to update.
|
||||
// None of the field paths in the mask may contain a reserved name.
|
||||
//
|
||||
// If the document exists on the server and has fields not referenced in the
|
||||
// mask, they are left unchanged.
|
||||
// Fields referenced in the mask, but not present in the input document, are
|
||||
// deleted from the document on the server.
|
||||
DocumentMask update_mask = 2;
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If the document has a field that is not present in this mask, that field
|
||||
// will not be returned in the response.
|
||||
DocumentMask mask = 3;
|
||||
|
||||
// An optional precondition on the document.
|
||||
// The request will fail if this is set and not met by the target document.
|
||||
Precondition current_document = 4;
|
||||
}
|
||||
|
||||
// The request for [Firestore.DeleteDocument][google.firestore.v1.Firestore.DeleteDocument].
|
||||
message DeleteDocumentRequest {
|
||||
// Required. The resource name of the Document to delete. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string name = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// An optional precondition on the document.
|
||||
// The request will fail if this is set and not met by the target document.
|
||||
Precondition current_document = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.BatchGetDocuments][google.firestore.v1.Firestore.BatchGetDocuments].
|
||||
message BatchGetDocumentsRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The names of the documents to retrieve. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// The request will fail if any of the document is not a child resource of the
|
||||
// given `database`. Duplicate names will be elided.
|
||||
repeated string documents = 2;
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If a document has a field that is not present in this mask, that field will
|
||||
// not be returned in the response.
|
||||
DocumentMask mask = 3;
|
||||
|
||||
// The consistency mode for this transaction.
|
||||
// If not set, defaults to strong consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads documents in a transaction.
|
||||
bytes transaction = 4;
|
||||
|
||||
// Starts a new transaction and reads the documents.
|
||||
// Defaults to a read-only transaction.
|
||||
// The new transaction ID will be returned as the first response in the
|
||||
// stream.
|
||||
TransactionOptions new_transaction = 5;
|
||||
|
||||
// Reads documents as they were at the given time.
|
||||
// This may not be older than 270 seconds.
|
||||
google.protobuf.Timestamp read_time = 7;
|
||||
}
|
||||
}
|
||||
|
||||
// The streamed response for [Firestore.BatchGetDocuments][google.firestore.v1.Firestore.BatchGetDocuments].
|
||||
message BatchGetDocumentsResponse {
|
||||
// A single result.
|
||||
// This can be empty if the server is just returning a transaction.
|
||||
oneof result {
|
||||
// A document that was requested.
|
||||
Document found = 1;
|
||||
|
||||
// A document name that was requested but does not exist. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string missing = 2;
|
||||
}
|
||||
|
||||
// The transaction that was started as part of this request.
|
||||
// Will only be set in the first response, and only if
|
||||
// [BatchGetDocumentsRequest.new_transaction][google.firestore.v1.BatchGetDocumentsRequest.new_transaction] was set in the request.
|
||||
bytes transaction = 3;
|
||||
|
||||
// The time at which the document was read.
|
||||
// This may be monotically increasing, in this case the previous documents in
|
||||
// the result stream are guaranteed not to have changed between their
|
||||
// read_time and this one.
|
||||
google.protobuf.Timestamp read_time = 4;
|
||||
}
|
||||
|
||||
// The request for [Firestore.BeginTransaction][google.firestore.v1.Firestore.BeginTransaction].
|
||||
message BeginTransactionRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The options for the transaction.
|
||||
// Defaults to a read-write transaction.
|
||||
TransactionOptions options = 2;
|
||||
}
|
||||
|
||||
// The response for [Firestore.BeginTransaction][google.firestore.v1.Firestore.BeginTransaction].
|
||||
message BeginTransactionResponse {
|
||||
// The transaction that was started.
|
||||
bytes transaction = 1;
|
||||
}
|
||||
|
||||
// The request for [Firestore.Commit][google.firestore.v1.Firestore.Commit].
|
||||
message CommitRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The writes to apply.
|
||||
//
|
||||
// Always executed atomically and in order.
|
||||
repeated Write writes = 2;
|
||||
|
||||
// If set, applies all writes in this transaction, and commits it.
|
||||
bytes transaction = 3;
|
||||
}
|
||||
|
||||
// The response for [Firestore.Commit][google.firestore.v1.Firestore.Commit].
|
||||
message CommitResponse {
|
||||
// The result of applying the writes.
|
||||
//
|
||||
// This i-th write result corresponds to the i-th write in the
|
||||
// request.
|
||||
repeated WriteResult write_results = 1;
|
||||
|
||||
// The time at which the commit occurred. Any read with an equal or greater
|
||||
// `read_time` is guaranteed to see the effects of the commit.
|
||||
google.protobuf.Timestamp commit_time = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.Rollback][google.firestore.v1.Firestore.Rollback].
|
||||
message RollbackRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// Required. The transaction to roll back.
|
||||
bytes transaction = 2 [(google.api.field_behavior) = REQUIRED];
|
||||
}
|
||||
|
||||
// The request for [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery].
|
||||
message RunQueryRequest {
|
||||
// Required. The parent resource name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents` or
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// For example:
|
||||
// `projects/my-project/databases/my-database/documents` or
|
||||
// `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The query to run.
|
||||
oneof query_type {
|
||||
// A structured query.
|
||||
StructuredQuery structured_query = 2;
|
||||
}
|
||||
|
||||
// The consistency mode for this transaction.
|
||||
// If not set, defaults to strong consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads documents in a transaction.
|
||||
bytes transaction = 5;
|
||||
|
||||
// Starts a new transaction and reads the documents.
|
||||
// Defaults to a read-only transaction.
|
||||
// The new transaction ID will be returned as the first response in the
|
||||
// stream.
|
||||
TransactionOptions new_transaction = 6;
|
||||
|
||||
// Reads documents as they were at the given time.
|
||||
// This may not be older than 270 seconds.
|
||||
google.protobuf.Timestamp read_time = 7;
|
||||
}
|
||||
}
|
||||
|
||||
// The response for [Firestore.RunQuery][google.firestore.v1.Firestore.RunQuery].
|
||||
message RunQueryResponse {
|
||||
// The transaction that was started as part of this request.
|
||||
// Can only be set in the first response, and only if
|
||||
// [RunQueryRequest.new_transaction][google.firestore.v1.RunQueryRequest.new_transaction] was set in the request.
|
||||
// If set, no other fields will be set in this response.
|
||||
bytes transaction = 2;
|
||||
|
||||
// A query result.
|
||||
// Not set when reporting partial progress.
|
||||
Document document = 1;
|
||||
|
||||
// The time at which the document was read. This may be monotonically
|
||||
// increasing; in this case, the previous documents in the result stream are
|
||||
// guaranteed not to have changed between their `read_time` and this one.
|
||||
//
|
||||
// If the query returns no results, a response with `read_time` and no
|
||||
// `document` will be sent, and this represents the time at which the query
|
||||
// was run.
|
||||
google.protobuf.Timestamp read_time = 3;
|
||||
|
||||
// The number of results that have been skipped due to an offset between
|
||||
// the last response and the current response.
|
||||
int32 skipped_results = 4;
|
||||
}
|
||||
|
||||
// The request for [Firestore.PartitionQuery][google.firestore.v1.Firestore.PartitionQuery].
|
||||
message PartitionQueryRequest {
|
||||
// Required. The parent resource name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents`.
|
||||
// Document resource names are not supported; only database resource names
|
||||
// can be specified.
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The query to partition.
|
||||
oneof query_type {
|
||||
// A structured query.
|
||||
// Query must specify collection with all descendants and be ordered by name
|
||||
// ascending. Other filters, order bys, limits, offsets, and start/end
|
||||
// cursors are not supported.
|
||||
StructuredQuery structured_query = 2;
|
||||
}
|
||||
|
||||
// The desired maximum number of partition points.
|
||||
// The partitions may be returned across multiple pages of results.
|
||||
// The number must be positive. The actual number of partitions
|
||||
// returned may be fewer.
|
||||
//
|
||||
// For example, this may be set to one fewer than the number of parallel
|
||||
// queries to be run, or in running a data pipeline job, one fewer than the
|
||||
// number of workers or compute instances available.
|
||||
int64 partition_count = 3;
|
||||
|
||||
// The `next_page_token` value returned from a previous call to
|
||||
// PartitionQuery that may be used to get an additional set of results.
|
||||
// There are no ordering guarantees between sets of results. Thus, using
|
||||
// multiple sets of results will require merging the different result sets.
|
||||
//
|
||||
// For example, two subsequent calls using a page_token may return:
|
||||
//
|
||||
// * cursor B, cursor M, cursor Q
|
||||
// * cursor A, cursor U, cursor W
|
||||
//
|
||||
// To obtain a complete result set ordered with respect to the results of the
|
||||
// query supplied to PartitionQuery, the results sets should be merged:
|
||||
// cursor A, cursor B, cursor M, cursor Q, cursor U, cursor W
|
||||
string page_token = 4;
|
||||
|
||||
// The maximum number of partitions to return in this call, subject to
|
||||
// `partition_count`.
|
||||
//
|
||||
// For example, if `partition_count` = 10 and `page_size` = 8, the first call
|
||||
// to PartitionQuery will return up to 8 partitions and a `next_page_token`
|
||||
// if more results exist. A second call to PartitionQuery will return up to
|
||||
// 2 partitions, to complete the total of 10 specified in `partition_count`.
|
||||
int32 page_size = 5;
|
||||
}
|
||||
|
||||
// The response for [Firestore.PartitionQuery][google.firestore.v1.Firestore.PartitionQuery].
|
||||
message PartitionQueryResponse {
|
||||
// Partition results.
|
||||
// Each partition is a split point that can be used by RunQuery as a starting
|
||||
// or end point for the query results. The RunQuery requests must be made with
|
||||
// the same query supplied to this PartitionQuery request. The partition
|
||||
// cursors will be ordered according to same ordering as the results of the
|
||||
// query supplied to PartitionQuery.
|
||||
//
|
||||
// For example, if a PartitionQuery request returns partition cursors A and B,
|
||||
// running the following three queries will return the entire result set of
|
||||
// the original query:
|
||||
//
|
||||
// * query, end_at A
|
||||
// * query, start_at A, end_at B
|
||||
// * query, start_at B
|
||||
//
|
||||
// An empty result may indicate that the query has too few results to be
|
||||
// partitioned.
|
||||
repeated Cursor partitions = 1;
|
||||
|
||||
// A page token that may be used to request an additional set of results, up
|
||||
// to the number specified by `partition_count` in the PartitionQuery request.
|
||||
// If blank, there are no more results.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.Write][google.firestore.v1.Firestore.Write].
|
||||
//
|
||||
// The first request creates a stream, or resumes an existing one from a token.
|
||||
//
|
||||
// When creating a new stream, the server replies with a response containing
|
||||
// only an ID and a token, to use in the next request.
|
||||
//
|
||||
// When resuming a stream, the server first streams any responses later than the
|
||||
// given token, then a response containing only an up-to-date token, to use in
|
||||
// the next request.
|
||||
message WriteRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
// This is only required in the first message.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The ID of the write stream to resume.
|
||||
// This may only be set in the first message. When left empty, a new write
|
||||
// stream will be created.
|
||||
string stream_id = 2;
|
||||
|
||||
// The writes to apply.
|
||||
//
|
||||
// Always executed atomically and in order.
|
||||
// This must be empty on the first request.
|
||||
// This may be empty on the last request.
|
||||
// This must not be empty on all other requests.
|
||||
repeated Write writes = 3;
|
||||
|
||||
// A stream token that was previously sent by the server.
|
||||
//
|
||||
// The client should set this field to the token from the most recent
|
||||
// [WriteResponse][google.firestore.v1.WriteResponse] it has received. This acknowledges that the client has
|
||||
// received responses up to this token. After sending this token, earlier
|
||||
// tokens may not be used anymore.
|
||||
//
|
||||
// The server may close the stream if there are too many unacknowledged
|
||||
// responses.
|
||||
//
|
||||
// Leave this field unset when creating a new stream. To resume a stream at
|
||||
// a specific point, set this field and the `stream_id` field.
|
||||
//
|
||||
// Leave this field unset when creating a new stream.
|
||||
bytes stream_token = 4;
|
||||
|
||||
// Labels associated with this write request.
|
||||
map<string, string> labels = 5;
|
||||
}
|
||||
|
||||
// The response for [Firestore.Write][google.firestore.v1.Firestore.Write].
|
||||
message WriteResponse {
|
||||
// The ID of the stream.
|
||||
// Only set on the first message, when a new stream was created.
|
||||
string stream_id = 1;
|
||||
|
||||
// A token that represents the position of this response in the stream.
|
||||
// This can be used by a client to resume the stream at this point.
|
||||
//
|
||||
// This field is always set.
|
||||
bytes stream_token = 2;
|
||||
|
||||
// The result of applying the writes.
|
||||
//
|
||||
// This i-th write result corresponds to the i-th write in the
|
||||
// request.
|
||||
repeated WriteResult write_results = 3;
|
||||
|
||||
// The time at which the commit occurred. Any read with an equal or greater
|
||||
// `read_time` is guaranteed to see the effects of the write.
|
||||
google.protobuf.Timestamp commit_time = 4;
|
||||
}
|
||||
|
||||
// A request for [Firestore.Listen][google.firestore.v1.Firestore.Listen]
|
||||
message ListenRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The supported target changes.
|
||||
oneof target_change {
|
||||
// A target to add to this stream.
|
||||
Target add_target = 2;
|
||||
|
||||
// The ID of a target to remove from this stream.
|
||||
int32 remove_target = 3;
|
||||
}
|
||||
|
||||
// Labels associated with this target change.
|
||||
map<string, string> labels = 4;
|
||||
}
|
||||
|
||||
// The response for [Firestore.Listen][google.firestore.v1.Firestore.Listen].
|
||||
message ListenResponse {
|
||||
// The supported responses.
|
||||
oneof response_type {
|
||||
// Targets have changed.
|
||||
TargetChange target_change = 2;
|
||||
|
||||
// A [Document][google.firestore.v1.Document] has changed.
|
||||
DocumentChange document_change = 3;
|
||||
|
||||
// A [Document][google.firestore.v1.Document] has been deleted.
|
||||
DocumentDelete document_delete = 4;
|
||||
|
||||
// A [Document][google.firestore.v1.Document] has been removed from a target (because it is no longer
|
||||
// relevant to that target).
|
||||
DocumentRemove document_remove = 6;
|
||||
|
||||
// A filter to apply to the set of documents previously returned for the
|
||||
// given target.
|
||||
//
|
||||
// Returned when documents may have been removed from the given target, but
|
||||
// the exact documents are unknown.
|
||||
ExistenceFilter filter = 5;
|
||||
}
|
||||
}
|
||||
|
||||
// A specification of a set of documents to listen to.
|
||||
message Target {
|
||||
// A target specified by a set of documents names.
|
||||
message DocumentsTarget {
|
||||
// The names of the documents to retrieve. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// The request will fail if any of the document is not a child resource of
|
||||
// the given `database`. Duplicate names will be elided.
|
||||
repeated string documents = 2;
|
||||
}
|
||||
|
||||
// A target specified by a query.
|
||||
message QueryTarget {
|
||||
// The parent resource name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents` or
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// For example:
|
||||
// `projects/my-project/databases/my-database/documents` or
|
||||
// `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
string parent = 1;
|
||||
|
||||
// The query to run.
|
||||
oneof query_type {
|
||||
// A structured query.
|
||||
StructuredQuery structured_query = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// The type of target to listen to.
|
||||
oneof target_type {
|
||||
// A target specified by a query.
|
||||
QueryTarget query = 2;
|
||||
|
||||
// A target specified by a set of document names.
|
||||
DocumentsTarget documents = 3;
|
||||
}
|
||||
|
||||
// When to start listening.
|
||||
//
|
||||
// If not specified, all matching Documents are returned before any
|
||||
// subsequent changes.
|
||||
oneof resume_type {
|
||||
// A resume token from a prior [TargetChange][google.firestore.v1.TargetChange] for an identical target.
|
||||
//
|
||||
// Using a resume token with a different target is unsupported and may fail.
|
||||
bytes resume_token = 4;
|
||||
|
||||
// Start listening after a specific `read_time`.
|
||||
//
|
||||
// The client must know the state of matching documents at this time.
|
||||
google.protobuf.Timestamp read_time = 11;
|
||||
}
|
||||
|
||||
// The target ID that identifies the target on the stream. Must be a positive
|
||||
// number and non-zero.
|
||||
int32 target_id = 5;
|
||||
|
||||
// If the target should be removed once it is current and consistent.
|
||||
bool once = 6;
|
||||
}
|
||||
|
||||
// Targets being watched have changed.
|
||||
message TargetChange {
|
||||
// The type of change.
|
||||
enum TargetChangeType {
|
||||
// No change has occurred. Used only to send an updated `resume_token`.
|
||||
NO_CHANGE = 0;
|
||||
|
||||
// The targets have been added.
|
||||
ADD = 1;
|
||||
|
||||
// The targets have been removed.
|
||||
REMOVE = 2;
|
||||
|
||||
// The targets reflect all changes committed before the targets were added
|
||||
// to the stream.
|
||||
//
|
||||
// This will be sent after or with a `read_time` that is greater than or
|
||||
// equal to the time at which the targets were added.
|
||||
//
|
||||
// Listeners can wait for this change if read-after-write semantics
|
||||
// are desired.
|
||||
CURRENT = 3;
|
||||
|
||||
// The targets have been reset, and a new initial state for the targets
|
||||
// will be returned in subsequent changes.
|
||||
//
|
||||
// After the initial state is complete, `CURRENT` will be returned even
|
||||
// if the target was previously indicated to be `CURRENT`.
|
||||
RESET = 4;
|
||||
}
|
||||
|
||||
// The type of change that occurred.
|
||||
TargetChangeType target_change_type = 1;
|
||||
|
||||
// The target IDs of targets that have changed.
|
||||
//
|
||||
// If empty, the change applies to all targets.
|
||||
//
|
||||
// The order of the target IDs is not defined.
|
||||
repeated int32 target_ids = 2;
|
||||
|
||||
// The error that resulted in this change, if applicable.
|
||||
google.rpc.Status cause = 3;
|
||||
|
||||
// A token that can be used to resume the stream for the given `target_ids`,
|
||||
// or all targets if `target_ids` is empty.
|
||||
//
|
||||
// Not set on every target change.
|
||||
bytes resume_token = 4;
|
||||
|
||||
// The consistent `read_time` for the given `target_ids` (omitted when the
|
||||
// target_ids are not at a consistent snapshot).
|
||||
//
|
||||
// The stream is guaranteed to send a `read_time` with `target_ids` empty
|
||||
// whenever the entire stream reaches a new consistent snapshot. ADD,
|
||||
// CURRENT, and RESET messages are guaranteed to (eventually) result in a
|
||||
// new consistent snapshot (while NO_CHANGE and REMOVE messages are not).
|
||||
//
|
||||
// For a given stream, `read_time` is guaranteed to be monotonically
|
||||
// increasing.
|
||||
google.protobuf.Timestamp read_time = 6;
|
||||
}
|
||||
|
||||
// The request for [Firestore.ListCollectionIds][google.firestore.v1.Firestore.ListCollectionIds].
|
||||
message ListCollectionIdsRequest {
|
||||
// Required. The parent document. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// For example:
|
||||
// `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The maximum number of results to return.
|
||||
int32 page_size = 2;
|
||||
|
||||
// A page token. Must be a value from
|
||||
// [ListCollectionIdsResponse][google.firestore.v1.ListCollectionIdsResponse].
|
||||
string page_token = 3;
|
||||
}
|
||||
|
||||
// The response from [Firestore.ListCollectionIds][google.firestore.v1.Firestore.ListCollectionIds].
|
||||
message ListCollectionIdsResponse {
|
||||
// The collection ids.
|
||||
repeated string collection_ids = 1;
|
||||
|
||||
// A page token that may be used to continue the list.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.BatchWrite][google.firestore.v1.Firestore.BatchWrite].
|
||||
message BatchWriteRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The writes to apply.
|
||||
//
|
||||
// Method does not apply writes atomically and does not guarantee ordering.
|
||||
// Each write succeeds or fails independently. You cannot write to the same
|
||||
// document more than once per request.
|
||||
repeated Write writes = 2;
|
||||
|
||||
// Labels associated with this batch write.
|
||||
map<string, string> labels = 3;
|
||||
}
|
||||
|
||||
// The response from [Firestore.BatchWrite][google.firestore.v1.Firestore.BatchWrite].
|
||||
message BatchWriteResponse {
|
||||
// The result of applying the writes.
|
||||
//
|
||||
// This i-th write result corresponds to the i-th write in the
|
||||
// request.
|
||||
repeated WriteResult write_results = 1;
|
||||
|
||||
// The status of applying the writes.
|
||||
//
|
||||
// This i-th write status corresponds to the i-th write in the
|
||||
// request.
|
||||
repeated google.rpc.Status status = 2;
|
||||
}
|
||||
Generated
Vendored
+301
@@ -0,0 +1,301 @@
|
||||
// Copyright 2021 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.firestore.v1;
|
||||
|
||||
import "google/firestore/v1/document.proto";
|
||||
import "google/protobuf/wrappers.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "QueryProto";
|
||||
option java_package = "com.google.firestore.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1";
|
||||
|
||||
// A Firestore query.
|
||||
message StructuredQuery {
|
||||
// A selection of a collection, such as `messages as m1`.
|
||||
message CollectionSelector {
|
||||
// The collection ID.
|
||||
// When set, selects only collections with this ID.
|
||||
string collection_id = 2;
|
||||
|
||||
// When false, selects only collections that are immediate children of
|
||||
// the `parent` specified in the containing `RunQueryRequest`.
|
||||
// When true, selects all descendant collections.
|
||||
bool all_descendants = 3;
|
||||
}
|
||||
|
||||
// A filter.
|
||||
message Filter {
|
||||
// The type of filter.
|
||||
oneof filter_type {
|
||||
// A composite filter.
|
||||
CompositeFilter composite_filter = 1;
|
||||
|
||||
// A filter on a document field.
|
||||
FieldFilter field_filter = 2;
|
||||
|
||||
// A filter that takes exactly one argument.
|
||||
UnaryFilter unary_filter = 3;
|
||||
}
|
||||
}
|
||||
|
||||
// A filter that merges multiple other filters using the given operator.
|
||||
message CompositeFilter {
|
||||
// A composite filter operator.
|
||||
enum Operator {
|
||||
// Unspecified. This value must not be used.
|
||||
OPERATOR_UNSPECIFIED = 0;
|
||||
|
||||
// The results are required to satisfy each of the combined filters.
|
||||
AND = 1;
|
||||
}
|
||||
|
||||
// The operator for combining multiple filters.
|
||||
Operator op = 1;
|
||||
|
||||
// The list of filters to combine.
|
||||
// Must contain at least one filter.
|
||||
repeated Filter filters = 2;
|
||||
}
|
||||
|
||||
// A filter on a specific field.
|
||||
message FieldFilter {
|
||||
// A field filter operator.
|
||||
enum Operator {
|
||||
// Unspecified. This value must not be used.
|
||||
OPERATOR_UNSPECIFIED = 0;
|
||||
|
||||
// The given `field` is less than the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `field` come first in `order_by`.
|
||||
LESS_THAN = 1;
|
||||
|
||||
// The given `field` is less than or equal to the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `field` come first in `order_by`.
|
||||
LESS_THAN_OR_EQUAL = 2;
|
||||
|
||||
// The given `field` is greater than the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `field` come first in `order_by`.
|
||||
GREATER_THAN = 3;
|
||||
|
||||
// The given `field` is greater than or equal to the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `field` come first in `order_by`.
|
||||
GREATER_THAN_OR_EQUAL = 4;
|
||||
|
||||
// The given `field` is equal to the given `value`.
|
||||
EQUAL = 5;
|
||||
|
||||
// The given `field` is not equal to the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * No other `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`.
|
||||
// * That `field` comes first in the `order_by`.
|
||||
NOT_EQUAL = 6;
|
||||
|
||||
// The given `field` is an array that contains the given `value`.
|
||||
ARRAY_CONTAINS = 7;
|
||||
|
||||
// The given `field` is equal to at least one value in the given array.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `value` is a non-empty `ArrayValue` with at most 10 values.
|
||||
// * No other `IN` or `ARRAY_CONTAINS_ANY` or `NOT_IN`.
|
||||
IN = 8;
|
||||
|
||||
// The given `field` is an array that contains any of the values in the
|
||||
// given array.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `value` is a non-empty `ArrayValue` with at most 10 values.
|
||||
// * No other `IN` or `ARRAY_CONTAINS_ANY` or `NOT_IN`.
|
||||
ARRAY_CONTAINS_ANY = 9;
|
||||
|
||||
// The value of the `field` is not in the given array.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `value` is a non-empty `ArrayValue` with at most 10 values.
|
||||
// * No other `IN`, `ARRAY_CONTAINS_ANY`, `NOT_IN`, `NOT_EQUAL`,
|
||||
// `IS_NOT_NULL`, or `IS_NOT_NAN`.
|
||||
// * That `field` comes first in the `order_by`.
|
||||
NOT_IN = 10;
|
||||
}
|
||||
|
||||
// The field to filter by.
|
||||
FieldReference field = 1;
|
||||
|
||||
// The operator to filter by.
|
||||
Operator op = 2;
|
||||
|
||||
// The value to compare to.
|
||||
Value value = 3;
|
||||
}
|
||||
|
||||
// A filter with a single operand.
|
||||
message UnaryFilter {
|
||||
// A unary operator.
|
||||
enum Operator {
|
||||
// Unspecified. This value must not be used.
|
||||
OPERATOR_UNSPECIFIED = 0;
|
||||
|
||||
// The given `field` is equal to `NaN`.
|
||||
IS_NAN = 2;
|
||||
|
||||
// The given `field` is equal to `NULL`.
|
||||
IS_NULL = 3;
|
||||
|
||||
// The given `field` is not equal to `NaN`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * No other `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`.
|
||||
// * That `field` comes first in the `order_by`.
|
||||
IS_NOT_NAN = 4;
|
||||
|
||||
// The given `field` is not equal to `NULL`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * A single `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`.
|
||||
// * That `field` comes first in the `order_by`.
|
||||
IS_NOT_NULL = 5;
|
||||
}
|
||||
|
||||
// The unary operator to apply.
|
||||
Operator op = 1;
|
||||
|
||||
// The argument to the filter.
|
||||
oneof operand_type {
|
||||
// The field to which to apply the operator.
|
||||
FieldReference field = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// An order on a field.
|
||||
message Order {
|
||||
// The field to order by.
|
||||
FieldReference field = 1;
|
||||
|
||||
// The direction to order by. Defaults to `ASCENDING`.
|
||||
Direction direction = 2;
|
||||
}
|
||||
|
||||
// A reference to a field, such as `max(messages.time) as max_time`.
|
||||
message FieldReference {
|
||||
string field_path = 2;
|
||||
}
|
||||
|
||||
// The projection of document's fields to return.
|
||||
message Projection {
|
||||
// The fields to return.
|
||||
//
|
||||
// If empty, all fields are returned. To only return the name
|
||||
// of the document, use `['__name__']`.
|
||||
repeated FieldReference fields = 2;
|
||||
}
|
||||
|
||||
// A sort direction.
|
||||
enum Direction {
|
||||
// Unspecified.
|
||||
DIRECTION_UNSPECIFIED = 0;
|
||||
|
||||
// Ascending.
|
||||
ASCENDING = 1;
|
||||
|
||||
// Descending.
|
||||
DESCENDING = 2;
|
||||
}
|
||||
|
||||
// The projection to return.
|
||||
Projection select = 1;
|
||||
|
||||
// The collections to query.
|
||||
repeated CollectionSelector from = 2;
|
||||
|
||||
// The filter to apply.
|
||||
Filter where = 3;
|
||||
|
||||
// The order to apply to the query results.
|
||||
//
|
||||
// Firestore guarantees a stable ordering through the following rules:
|
||||
//
|
||||
// * Any field required to appear in `order_by`, that is not already
|
||||
// specified in `order_by`, is appended to the order in field name order
|
||||
// by default.
|
||||
// * If an order on `__name__` is not specified, it is appended by default.
|
||||
//
|
||||
// Fields are appended with the same sort direction as the last order
|
||||
// specified, or 'ASCENDING' if no order was specified. For example:
|
||||
//
|
||||
// * `SELECT * FROM Foo ORDER BY A` becomes
|
||||
// `SELECT * FROM Foo ORDER BY A, __name__`
|
||||
// * `SELECT * FROM Foo ORDER BY A DESC` becomes
|
||||
// `SELECT * FROM Foo ORDER BY A DESC, __name__ DESC`
|
||||
// * `SELECT * FROM Foo WHERE A > 1` becomes
|
||||
// `SELECT * FROM Foo WHERE A > 1 ORDER BY A, __name__`
|
||||
repeated Order order_by = 4;
|
||||
|
||||
// A starting point for the query results.
|
||||
Cursor start_at = 7;
|
||||
|
||||
// A end point for the query results.
|
||||
Cursor end_at = 8;
|
||||
|
||||
// The number of results to skip.
|
||||
//
|
||||
// Applies before limit, but after all other constraints. Must be >= 0 if
|
||||
// specified.
|
||||
int32 offset = 6;
|
||||
|
||||
// The maximum number of results to return.
|
||||
//
|
||||
// Applies after all other constraints.
|
||||
// Must be >= 0 if specified.
|
||||
google.protobuf.Int32Value limit = 5;
|
||||
}
|
||||
|
||||
// A position in a query result set.
|
||||
message Cursor {
|
||||
// The values that represent a position, in the order they appear in
|
||||
// the order by clause of a query.
|
||||
//
|
||||
// Can contain fewer values than specified in the order by clause.
|
||||
repeated Value values = 1;
|
||||
|
||||
// If the position is just before or just after the given values, relative
|
||||
// to the sort order defined by the query.
|
||||
bool before = 2;
|
||||
}
|
||||
Generated
Vendored
+259
@@ -0,0 +1,259 @@
|
||||
// Copyright 2021 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.firestore.v1;
|
||||
|
||||
import "google/firestore/v1/common.proto";
|
||||
import "google/firestore/v1/document.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "WriteProto";
|
||||
option java_package = "com.google.firestore.v1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1";
|
||||
|
||||
// A write on a document.
|
||||
message Write {
|
||||
// The operation to execute.
|
||||
oneof operation {
|
||||
// A document to write.
|
||||
Document update = 1;
|
||||
|
||||
// A document name to delete. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string delete = 2;
|
||||
|
||||
// Applies a transformation to a document.
|
||||
DocumentTransform transform = 6;
|
||||
}
|
||||
|
||||
// The fields to update in this write.
|
||||
//
|
||||
// This field can be set only when the operation is `update`.
|
||||
// If the mask is not set for an `update` and the document exists, any
|
||||
// existing data will be overwritten.
|
||||
// If the mask is set and the document on the server has fields not covered by
|
||||
// the mask, they are left unchanged.
|
||||
// Fields referenced in the mask, but not present in the input document, are
|
||||
// deleted from the document on the server.
|
||||
// The field paths in this mask must not contain a reserved field name.
|
||||
DocumentMask update_mask = 3;
|
||||
|
||||
// The transforms to perform after update.
|
||||
//
|
||||
// This field can be set only when the operation is `update`. If present, this
|
||||
// write is equivalent to performing `update` and `transform` to the same
|
||||
// document atomically and in order.
|
||||
repeated DocumentTransform.FieldTransform update_transforms = 7;
|
||||
|
||||
// An optional precondition on the document.
|
||||
//
|
||||
// The write will fail if this is set and not met by the target document.
|
||||
Precondition current_document = 4;
|
||||
}
|
||||
|
||||
// A transformation of a document.
|
||||
message DocumentTransform {
|
||||
// A transformation of a field of the document.
|
||||
message FieldTransform {
|
||||
// A value that is calculated by the server.
|
||||
enum ServerValue {
|
||||
// Unspecified. This value must not be used.
|
||||
SERVER_VALUE_UNSPECIFIED = 0;
|
||||
|
||||
// The time at which the server processed the request, with millisecond
|
||||
// precision. If used on multiple fields (same or different documents) in
|
||||
// a transaction, all the fields will get the same server timestamp.
|
||||
REQUEST_TIME = 1;
|
||||
}
|
||||
|
||||
// The path of the field. See [Document.fields][google.firestore.v1.Document.fields] for the field path syntax
|
||||
// reference.
|
||||
string field_path = 1;
|
||||
|
||||
// The transformation to apply on the field.
|
||||
oneof transform_type {
|
||||
// Sets the field to the given server value.
|
||||
ServerValue set_to_server_value = 2;
|
||||
|
||||
// Adds the given value to the field's current value.
|
||||
//
|
||||
// This must be an integer or a double value.
|
||||
// If the field is not an integer or double, or if the field does not yet
|
||||
// exist, the transformation will set the field to the given value.
|
||||
// If either of the given value or the current field value are doubles,
|
||||
// both values will be interpreted as doubles. Double arithmetic and
|
||||
// representation of double values follow IEEE 754 semantics.
|
||||
// If there is positive/negative integer overflow, the field is resolved
|
||||
// to the largest magnitude positive/negative integer.
|
||||
Value increment = 3;
|
||||
|
||||
// Sets the field to the maximum of its current value and the given value.
|
||||
//
|
||||
// This must be an integer or a double value.
|
||||
// If the field is not an integer or double, or if the field does not yet
|
||||
// exist, the transformation will set the field to the given value.
|
||||
// If a maximum operation is applied where the field and the input value
|
||||
// are of mixed types (that is - one is an integer and one is a double)
|
||||
// the field takes on the type of the larger operand. If the operands are
|
||||
// equivalent (e.g. 3 and 3.0), the field does not change.
|
||||
// 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and
|
||||
// zero input value is always the stored value.
|
||||
// The maximum of any numeric value x and NaN is NaN.
|
||||
Value maximum = 4;
|
||||
|
||||
// Sets the field to the minimum of its current value and the given value.
|
||||
//
|
||||
// This must be an integer or a double value.
|
||||
// If the field is not an integer or double, or if the field does not yet
|
||||
// exist, the transformation will set the field to the input value.
|
||||
// If a minimum operation is applied where the field and the input value
|
||||
// are of mixed types (that is - one is an integer and one is a double)
|
||||
// the field takes on the type of the smaller operand. If the operands are
|
||||
// equivalent (e.g. 3 and 3.0), the field does not change.
|
||||
// 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and
|
||||
// zero input value is always the stored value.
|
||||
// The minimum of any numeric value x and NaN is NaN.
|
||||
Value minimum = 5;
|
||||
|
||||
// Append the given elements in order if they are not already present in
|
||||
// the current field value.
|
||||
// If the field is not an array, or if the field does not yet exist, it is
|
||||
// first set to the empty array.
|
||||
//
|
||||
// Equivalent numbers of different types (e.g. 3L and 3.0) are
|
||||
// considered equal when checking if a value is missing.
|
||||
// NaN is equal to NaN, and Null is equal to Null.
|
||||
// If the input contains multiple equivalent values, only the first will
|
||||
// be considered.
|
||||
//
|
||||
// The corresponding transform_result will be the null value.
|
||||
ArrayValue append_missing_elements = 6;
|
||||
|
||||
// Remove all of the given elements from the array in the field.
|
||||
// If the field is not an array, or if the field does not yet exist, it is
|
||||
// set to the empty array.
|
||||
//
|
||||
// Equivalent numbers of the different types (e.g. 3L and 3.0) are
|
||||
// considered equal when deciding whether an element should be removed.
|
||||
// NaN is equal to NaN, and Null is equal to Null.
|
||||
// This will remove all equivalent values if there are duplicates.
|
||||
//
|
||||
// The corresponding transform_result will be the null value.
|
||||
ArrayValue remove_all_from_array = 7;
|
||||
}
|
||||
}
|
||||
|
||||
// The name of the document to transform.
|
||||
string document = 1;
|
||||
|
||||
// The list of transformations to apply to the fields of the document, in
|
||||
// order.
|
||||
// This must not be empty.
|
||||
repeated FieldTransform field_transforms = 2;
|
||||
}
|
||||
|
||||
// The result of applying a write.
|
||||
message WriteResult {
|
||||
// The last update time of the document after applying the write. Not set
|
||||
// after a `delete`.
|
||||
//
|
||||
// If the write did not actually change the document, this will be the
|
||||
// previous update_time.
|
||||
google.protobuf.Timestamp update_time = 1;
|
||||
|
||||
// The results of applying each [DocumentTransform.FieldTransform][google.firestore.v1.DocumentTransform.FieldTransform], in the
|
||||
// same order.
|
||||
repeated Value transform_results = 2;
|
||||
}
|
||||
|
||||
// A [Document][google.firestore.v1.Document] has changed.
|
||||
//
|
||||
// May be the result of multiple [writes][google.firestore.v1.Write], including deletes, that
|
||||
// ultimately resulted in a new value for the [Document][google.firestore.v1.Document].
|
||||
//
|
||||
// Multiple [DocumentChange][google.firestore.v1.DocumentChange] messages may be returned for the same logical
|
||||
// change, if multiple targets are affected.
|
||||
message DocumentChange {
|
||||
// The new state of the [Document][google.firestore.v1.Document].
|
||||
//
|
||||
// If `mask` is set, contains only fields that were updated or added.
|
||||
Document document = 1;
|
||||
|
||||
// A set of target IDs of targets that match this document.
|
||||
repeated int32 target_ids = 5;
|
||||
|
||||
// A set of target IDs for targets that no longer match this document.
|
||||
repeated int32 removed_target_ids = 6;
|
||||
}
|
||||
|
||||
// A [Document][google.firestore.v1.Document] has been deleted.
|
||||
//
|
||||
// May be the result of multiple [writes][google.firestore.v1.Write], including updates, the
|
||||
// last of which deleted the [Document][google.firestore.v1.Document].
|
||||
//
|
||||
// Multiple [DocumentDelete][google.firestore.v1.DocumentDelete] messages may be returned for the same logical
|
||||
// delete, if multiple targets are affected.
|
||||
message DocumentDelete {
|
||||
// The resource name of the [Document][google.firestore.v1.Document] that was deleted.
|
||||
string document = 1;
|
||||
|
||||
// A set of target IDs for targets that previously matched this entity.
|
||||
repeated int32 removed_target_ids = 6;
|
||||
|
||||
// The read timestamp at which the delete was observed.
|
||||
//
|
||||
// Greater or equal to the `commit_time` of the delete.
|
||||
google.protobuf.Timestamp read_time = 4;
|
||||
}
|
||||
|
||||
// A [Document][google.firestore.v1.Document] has been removed from the view of the targets.
|
||||
//
|
||||
// Sent if the document is no longer relevant to a target and is out of view.
|
||||
// Can be sent instead of a DocumentDelete or a DocumentChange if the server
|
||||
// can not send the new value of the document.
|
||||
//
|
||||
// Multiple [DocumentRemove][google.firestore.v1.DocumentRemove] messages may be returned for the same logical
|
||||
// write or delete, if multiple targets are affected.
|
||||
message DocumentRemove {
|
||||
// The resource name of the [Document][google.firestore.v1.Document] that has gone out of view.
|
||||
string document = 1;
|
||||
|
||||
// A set of target IDs for targets that previously matched this document.
|
||||
repeated int32 removed_target_ids = 2;
|
||||
|
||||
// The read timestamp at which the remove was observed.
|
||||
//
|
||||
// Greater or equal to the `commit_time` of the change/delete/remove.
|
||||
google.protobuf.Timestamp read_time = 4;
|
||||
}
|
||||
|
||||
// A digest of all the documents that match a given target.
|
||||
message ExistenceFilter {
|
||||
// The target ID to which this filter applies.
|
||||
int32 target_id = 1;
|
||||
|
||||
// The total count of documents that match [target_id][google.firestore.v1.ExistenceFilter.target_id].
|
||||
//
|
||||
// If different from the count of documents in the client that match, the
|
||||
// client must manually determine which documents no longer match the target.
|
||||
int32 count = 2;
|
||||
}
|
||||
Generated
Vendored
+83
@@ -0,0 +1,83 @@
|
||||
// Copyright 2021 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.firestore.v1beta1;
|
||||
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1Beta1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1beta1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "CommonProto";
|
||||
option java_package = "com.google.firestore.v1beta1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1beta1";
|
||||
|
||||
// A set of field paths on a document.
|
||||
// Used to restrict a get or update operation on a document to a subset of its
|
||||
// fields.
|
||||
// This is different from standard field masks, as this is always scoped to a
|
||||
// [Document][google.firestore.v1beta1.Document], and takes in account the dynamic nature of [Value][google.firestore.v1beta1.Value].
|
||||
message DocumentMask {
|
||||
// The list of field paths in the mask. See [Document.fields][google.firestore.v1beta1.Document.fields] for a field
|
||||
// path syntax reference.
|
||||
repeated string field_paths = 1;
|
||||
}
|
||||
|
||||
// A precondition on a document, used for conditional operations.
|
||||
message Precondition {
|
||||
// The type of precondition.
|
||||
oneof condition_type {
|
||||
// When set to `true`, the target document must exist.
|
||||
// When set to `false`, the target document must not exist.
|
||||
bool exists = 1;
|
||||
|
||||
// When set, the target document must exist and have been last updated at
|
||||
// that time.
|
||||
google.protobuf.Timestamp update_time = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// Options for creating a new transaction.
|
||||
message TransactionOptions {
|
||||
// Options for a transaction that can be used to read and write documents.
|
||||
message ReadWrite {
|
||||
// An optional transaction to retry.
|
||||
bytes retry_transaction = 1;
|
||||
}
|
||||
|
||||
// Options for a transaction that can only be used to read documents.
|
||||
message ReadOnly {
|
||||
// The consistency mode for this transaction. If not set, defaults to strong
|
||||
// consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads documents at the given time.
|
||||
// This may not be older than 60 seconds.
|
||||
google.protobuf.Timestamp read_time = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// The mode of the transaction.
|
||||
oneof mode {
|
||||
// The transaction can only be used for read operations.
|
||||
ReadOnly read_only = 2;
|
||||
|
||||
// The transaction can be used for both read and write operations.
|
||||
ReadWrite read_write = 3;
|
||||
}
|
||||
}
|
||||
Generated
Vendored
+150
@@ -0,0 +1,150 @@
|
||||
// Copyright 2021 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.firestore.v1beta1;
|
||||
|
||||
import "google/protobuf/struct.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/type/latlng.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1Beta1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1beta1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "DocumentProto";
|
||||
option java_package = "com.google.firestore.v1beta1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1beta1";
|
||||
|
||||
// A Firestore document.
|
||||
//
|
||||
// Must not exceed 1 MiB - 4 bytes.
|
||||
message Document {
|
||||
// The resource name of the document, for example
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string name = 1;
|
||||
|
||||
// The document's fields.
|
||||
//
|
||||
// The map keys represent field names.
|
||||
//
|
||||
// A simple field name contains only characters `a` to `z`, `A` to `Z`,
|
||||
// `0` to `9`, or `_`, and must not start with `0` to `9`. For example,
|
||||
// `foo_bar_17`.
|
||||
//
|
||||
// Field names matching the regular expression `__.*__` are reserved. Reserved
|
||||
// field names are forbidden except in certain documented contexts. The map
|
||||
// keys, represented as UTF-8, must not exceed 1,500 bytes and cannot be
|
||||
// empty.
|
||||
//
|
||||
// Field paths may be used in other contexts to refer to structured fields
|
||||
// defined here. For `map_value`, the field path is represented by the simple
|
||||
// or quoted field names of the containing fields, delimited by `.`. For
|
||||
// example, the structured field
|
||||
// `"foo" : { map_value: { "x&y" : { string_value: "hello" }}}` would be
|
||||
// represented by the field path `foo.x&y`.
|
||||
//
|
||||
// Within a field path, a quoted field name starts and ends with `` ` `` and
|
||||
// may contain any character. Some characters, including `` ` ``, must be
|
||||
// escaped using a `\`. For example, `` `x&y` `` represents `x&y` and
|
||||
// `` `bak\`tik` `` represents `` bak`tik ``.
|
||||
map<string, Value> fields = 2;
|
||||
|
||||
// Output only. The time at which the document was created.
|
||||
//
|
||||
// This value increases monotonically when a document is deleted then
|
||||
// recreated. It can also be compared to values from other documents and
|
||||
// the `read_time` of a query.
|
||||
google.protobuf.Timestamp create_time = 3;
|
||||
|
||||
// Output only. The time at which the document was last changed.
|
||||
//
|
||||
// This value is initially set to the `create_time` then increases
|
||||
// monotonically with each change to the document. It can also be
|
||||
// compared to values from other documents and the `read_time` of a query.
|
||||
google.protobuf.Timestamp update_time = 4;
|
||||
}
|
||||
|
||||
// A message that can hold any of the supported value types.
|
||||
message Value {
|
||||
// Must have a value set.
|
||||
oneof value_type {
|
||||
// A null value.
|
||||
google.protobuf.NullValue null_value = 11;
|
||||
|
||||
// A boolean value.
|
||||
bool boolean_value = 1;
|
||||
|
||||
// An integer value.
|
||||
int64 integer_value = 2;
|
||||
|
||||
// A double value.
|
||||
double double_value = 3;
|
||||
|
||||
// A timestamp value.
|
||||
//
|
||||
// Precise only to microseconds. When stored, any additional precision is
|
||||
// rounded down.
|
||||
google.protobuf.Timestamp timestamp_value = 10;
|
||||
|
||||
// A string value.
|
||||
//
|
||||
// The string, represented as UTF-8, must not exceed 1 MiB - 89 bytes.
|
||||
// Only the first 1,500 bytes of the UTF-8 representation are considered by
|
||||
// queries.
|
||||
string string_value = 17;
|
||||
|
||||
// A bytes value.
|
||||
//
|
||||
// Must not exceed 1 MiB - 89 bytes.
|
||||
// Only the first 1,500 bytes are considered by queries.
|
||||
bytes bytes_value = 18;
|
||||
|
||||
// A reference to a document. For example:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string reference_value = 5;
|
||||
|
||||
// A geo point value representing a point on the surface of Earth.
|
||||
google.type.LatLng geo_point_value = 8;
|
||||
|
||||
// An array value.
|
||||
//
|
||||
// Cannot directly contain another array value, though can contain an
|
||||
// map which contains another array.
|
||||
ArrayValue array_value = 9;
|
||||
|
||||
// A map value.
|
||||
MapValue map_value = 6;
|
||||
}
|
||||
}
|
||||
|
||||
// An array value.
|
||||
message ArrayValue {
|
||||
// Values in the array.
|
||||
repeated Value values = 1;
|
||||
}
|
||||
|
||||
// A map value.
|
||||
message MapValue {
|
||||
// The map's fields.
|
||||
//
|
||||
// The map keys represent field names. Field names matching the regular
|
||||
// expression `__.*__` are reserved. Reserved field names are forbidden except
|
||||
// in certain documented contexts. The map keys, represented as UTF-8, must
|
||||
// not exceed 1,500 bytes and cannot be empty.
|
||||
map<string, Value> fields = 1;
|
||||
}
|
||||
Generated
Vendored
+900
@@ -0,0 +1,900 @@
|
||||
// Copyright 2021 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.firestore.v1beta1;
|
||||
|
||||
import "google/api/annotations.proto";
|
||||
import "google/api/client.proto";
|
||||
import "google/api/field_behavior.proto";
|
||||
import "google/firestore/v1beta1/common.proto";
|
||||
import "google/firestore/v1beta1/document.proto";
|
||||
import "google/firestore/v1beta1/query.proto";
|
||||
import "google/firestore/v1beta1/write.proto";
|
||||
import "google/protobuf/empty.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/rpc/status.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1Beta1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1beta1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "FirestoreProto";
|
||||
option java_package = "com.google.firestore.v1beta1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1beta1";
|
||||
|
||||
// Specification of the Firestore API.
|
||||
|
||||
// The Cloud Firestore service.
|
||||
//
|
||||
// Cloud Firestore is a fast, fully managed, serverless, cloud-native NoSQL
|
||||
// document database that simplifies storing, syncing, and querying data for
|
||||
// your mobile, web, and IoT apps at global scale. Its client libraries provide
|
||||
// live synchronization and offline support, while its security features and
|
||||
// integrations with Firebase and Google Cloud Platform (GCP) accelerate
|
||||
// building truly serverless apps.
|
||||
service Firestore {
|
||||
option (google.api.default_host) = "firestore.googleapis.com";
|
||||
option (google.api.oauth_scopes) =
|
||||
"https://www.googleapis.com/auth/cloud-platform,"
|
||||
"https://www.googleapis.com/auth/datastore";
|
||||
|
||||
// Gets a single document.
|
||||
rpc GetDocument(GetDocumentRequest) returns (Document) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1beta1/{name=projects/*/databases/*/documents/*/**}"
|
||||
};
|
||||
}
|
||||
|
||||
// Lists documents.
|
||||
rpc ListDocuments(ListDocumentsRequest) returns (ListDocumentsResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1beta1/{parent=projects/*/databases/*/documents/*/**}/{collection_id}"
|
||||
};
|
||||
}
|
||||
|
||||
// Updates or inserts a document.
|
||||
rpc UpdateDocument(UpdateDocumentRequest) returns (Document) {
|
||||
option (google.api.http) = {
|
||||
patch: "/v1beta1/{document.name=projects/*/databases/*/documents/*/**}"
|
||||
body: "document"
|
||||
};
|
||||
option (google.api.method_signature) = "document,update_mask";
|
||||
}
|
||||
|
||||
// Deletes a document.
|
||||
rpc DeleteDocument(DeleteDocumentRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
delete: "/v1beta1/{name=projects/*/databases/*/documents/*/**}"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
}
|
||||
|
||||
// Gets multiple documents.
|
||||
//
|
||||
// Documents returned by this method are not guaranteed to be returned in the
|
||||
// same order that they were requested.
|
||||
rpc BatchGetDocuments(BatchGetDocumentsRequest) returns (stream BatchGetDocumentsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{database=projects/*/databases/*}/documents:batchGet"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Starts a new transaction.
|
||||
rpc BeginTransaction(BeginTransactionRequest) returns (BeginTransactionResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{database=projects/*/databases/*}/documents:beginTransaction"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "database";
|
||||
}
|
||||
|
||||
// Commits a transaction, while optionally updating documents.
|
||||
rpc Commit(CommitRequest) returns (CommitResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{database=projects/*/databases/*}/documents:commit"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "database,writes";
|
||||
}
|
||||
|
||||
// Rolls back a transaction.
|
||||
rpc Rollback(RollbackRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{database=projects/*/databases/*}/documents:rollback"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "database,transaction";
|
||||
}
|
||||
|
||||
// Runs a query.
|
||||
rpc RunQuery(RunQueryRequest) returns (stream RunQueryResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{parent=projects/*/databases/*/documents}:runQuery"
|
||||
body: "*"
|
||||
additional_bindings {
|
||||
post: "/v1beta1/{parent=projects/*/databases/*/documents/*/**}:runQuery"
|
||||
body: "*"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Partitions a query by returning partition cursors that can be used to run
|
||||
// the query in parallel. The returned partition cursors are split points that
|
||||
// can be used by RunQuery as starting/end points for the query results.
|
||||
rpc PartitionQuery(PartitionQueryRequest) returns (PartitionQueryResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{parent=projects/*/databases/*/documents}:partitionQuery"
|
||||
body: "*"
|
||||
additional_bindings {
|
||||
post: "/v1beta1/{parent=projects/*/databases/*/documents/*/**}:partitionQuery"
|
||||
body: "*"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Streams batches of document updates and deletes, in order.
|
||||
rpc Write(stream WriteRequest) returns (stream WriteResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{database=projects/*/databases/*}/documents:write"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Listens to changes.
|
||||
rpc Listen(stream ListenRequest) returns (stream ListenResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{database=projects/*/databases/*}/documents:listen"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Lists all the collection IDs underneath a document.
|
||||
rpc ListCollectionIds(ListCollectionIdsRequest) returns (ListCollectionIdsResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{parent=projects/*/databases/*/documents}:listCollectionIds"
|
||||
body: "*"
|
||||
additional_bindings {
|
||||
post: "/v1beta1/{parent=projects/*/databases/*/documents/*/**}:listCollectionIds"
|
||||
body: "*"
|
||||
}
|
||||
};
|
||||
option (google.api.method_signature) = "parent";
|
||||
}
|
||||
|
||||
// Applies a batch of write operations.
|
||||
//
|
||||
// The BatchWrite method does not apply the write operations atomically
|
||||
// and can apply them out of order. Method does not allow more than one write
|
||||
// per document. Each write succeeds or fails independently. See the
|
||||
// [BatchWriteResponse][google.firestore.v1beta1.BatchWriteResponse] for the success status of each write.
|
||||
//
|
||||
// If you require an atomically applied set of writes, use
|
||||
// [Commit][google.firestore.v1beta1.Firestore.Commit] instead.
|
||||
rpc BatchWrite(BatchWriteRequest) returns (BatchWriteResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{database=projects/*/databases/*}/documents:batchWrite"
|
||||
body: "*"
|
||||
};
|
||||
}
|
||||
|
||||
// Creates a new document.
|
||||
rpc CreateDocument(CreateDocumentRequest) returns (Document) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1beta1/{parent=projects/*/databases/*/documents/**}/{collection_id}"
|
||||
body: "document"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// The request for [Firestore.GetDocument][google.firestore.v1beta1.Firestore.GetDocument].
|
||||
message GetDocumentRequest {
|
||||
// Required. The resource name of the Document to get. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string name = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If the document has a field that is not present in this mask, that field
|
||||
// will not be returned in the response.
|
||||
DocumentMask mask = 2;
|
||||
|
||||
// The consistency mode for this transaction.
|
||||
// If not set, defaults to strong consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads the document in a transaction.
|
||||
bytes transaction = 3;
|
||||
|
||||
// Reads the version of the document at the given time.
|
||||
// This may not be older than 270 seconds.
|
||||
google.protobuf.Timestamp read_time = 5;
|
||||
}
|
||||
}
|
||||
|
||||
// The request for [Firestore.ListDocuments][google.firestore.v1beta1.Firestore.ListDocuments].
|
||||
message ListDocumentsRequest {
|
||||
// Required. The parent resource name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents` or
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// For example:
|
||||
// `projects/my-project/databases/my-database/documents` or
|
||||
// `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`
|
||||
// or `messages`.
|
||||
string collection_id = 2 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The maximum number of documents to return.
|
||||
int32 page_size = 3;
|
||||
|
||||
// The `next_page_token` value returned from a previous List request, if any.
|
||||
string page_token = 4;
|
||||
|
||||
// The order to sort results by. For example: `priority desc, name`.
|
||||
string order_by = 6;
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If a document has a field that is not present in this mask, that field
|
||||
// will not be returned in the response.
|
||||
DocumentMask mask = 7;
|
||||
|
||||
// The consistency mode for this transaction.
|
||||
// If not set, defaults to strong consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads documents in a transaction.
|
||||
bytes transaction = 8;
|
||||
|
||||
// Reads documents as they were at the given time.
|
||||
// This may not be older than 270 seconds.
|
||||
google.protobuf.Timestamp read_time = 10;
|
||||
}
|
||||
|
||||
// If the list should show missing documents. A missing document is a
|
||||
// document that does not exist but has sub-documents. These documents will
|
||||
// be returned with a key but will not have fields, [Document.create_time][google.firestore.v1beta1.Document.create_time],
|
||||
// or [Document.update_time][google.firestore.v1beta1.Document.update_time] set.
|
||||
//
|
||||
// Requests with `show_missing` may not specify `where` or
|
||||
// `order_by`.
|
||||
bool show_missing = 12;
|
||||
}
|
||||
|
||||
// The response for [Firestore.ListDocuments][google.firestore.v1beta1.Firestore.ListDocuments].
|
||||
message ListDocumentsResponse {
|
||||
// The Documents found.
|
||||
repeated Document documents = 1;
|
||||
|
||||
// The next page token.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.CreateDocument][google.firestore.v1beta1.Firestore.CreateDocument].
|
||||
message CreateDocumentRequest {
|
||||
// Required. The parent resource. For example:
|
||||
// `projects/{project_id}/databases/{database_id}/documents` or
|
||||
// `projects/{project_id}/databases/{database_id}/documents/chatrooms/{chatroom_id}`
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`.
|
||||
string collection_id = 2 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The client-assigned document ID to use for this document.
|
||||
//
|
||||
// Optional. If not specified, an ID will be assigned by the service.
|
||||
string document_id = 3;
|
||||
|
||||
// Required. The document to create. `name` must not be set.
|
||||
Document document = 4 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If the document has a field that is not present in this mask, that field
|
||||
// will not be returned in the response.
|
||||
DocumentMask mask = 5;
|
||||
}
|
||||
|
||||
// The request for [Firestore.UpdateDocument][google.firestore.v1beta1.Firestore.UpdateDocument].
|
||||
message UpdateDocumentRequest {
|
||||
// Required. The updated document.
|
||||
// Creates the document if it does not already exist.
|
||||
Document document = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The fields to update.
|
||||
// None of the field paths in the mask may contain a reserved name.
|
||||
//
|
||||
// If the document exists on the server and has fields not referenced in the
|
||||
// mask, they are left unchanged.
|
||||
// Fields referenced in the mask, but not present in the input document, are
|
||||
// deleted from the document on the server.
|
||||
DocumentMask update_mask = 2;
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If the document has a field that is not present in this mask, that field
|
||||
// will not be returned in the response.
|
||||
DocumentMask mask = 3;
|
||||
|
||||
// An optional precondition on the document.
|
||||
// The request will fail if this is set and not met by the target document.
|
||||
Precondition current_document = 4;
|
||||
}
|
||||
|
||||
// The request for [Firestore.DeleteDocument][google.firestore.v1beta1.Firestore.DeleteDocument].
|
||||
message DeleteDocumentRequest {
|
||||
// Required. The resource name of the Document to delete. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string name = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// An optional precondition on the document.
|
||||
// The request will fail if this is set and not met by the target document.
|
||||
Precondition current_document = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.BatchGetDocuments][google.firestore.v1beta1.Firestore.BatchGetDocuments].
|
||||
message BatchGetDocumentsRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The names of the documents to retrieve. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// The request will fail if any of the document is not a child resource of the
|
||||
// given `database`. Duplicate names will be elided.
|
||||
repeated string documents = 2;
|
||||
|
||||
// The fields to return. If not set, returns all fields.
|
||||
//
|
||||
// If a document has a field that is not present in this mask, that field will
|
||||
// not be returned in the response.
|
||||
DocumentMask mask = 3;
|
||||
|
||||
// The consistency mode for this transaction.
|
||||
// If not set, defaults to strong consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads documents in a transaction.
|
||||
bytes transaction = 4;
|
||||
|
||||
// Starts a new transaction and reads the documents.
|
||||
// Defaults to a read-only transaction.
|
||||
// The new transaction ID will be returned as the first response in the
|
||||
// stream.
|
||||
TransactionOptions new_transaction = 5;
|
||||
|
||||
// Reads documents as they were at the given time.
|
||||
// This may not be older than 270 seconds.
|
||||
google.protobuf.Timestamp read_time = 7;
|
||||
}
|
||||
}
|
||||
|
||||
// The streamed response for [Firestore.BatchGetDocuments][google.firestore.v1beta1.Firestore.BatchGetDocuments].
|
||||
message BatchGetDocumentsResponse {
|
||||
// A single result.
|
||||
// This can be empty if the server is just returning a transaction.
|
||||
oneof result {
|
||||
// A document that was requested.
|
||||
Document found = 1;
|
||||
|
||||
// A document name that was requested but does not exist. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string missing = 2;
|
||||
}
|
||||
|
||||
// The transaction that was started as part of this request.
|
||||
// Will only be set in the first response, and only if
|
||||
// [BatchGetDocumentsRequest.new_transaction][google.firestore.v1beta1.BatchGetDocumentsRequest.new_transaction] was set in the request.
|
||||
bytes transaction = 3;
|
||||
|
||||
// The time at which the document was read.
|
||||
// This may be monotically increasing, in this case the previous documents in
|
||||
// the result stream are guaranteed not to have changed between their
|
||||
// read_time and this one.
|
||||
google.protobuf.Timestamp read_time = 4;
|
||||
}
|
||||
|
||||
// The request for [Firestore.BeginTransaction][google.firestore.v1beta1.Firestore.BeginTransaction].
|
||||
message BeginTransactionRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The options for the transaction.
|
||||
// Defaults to a read-write transaction.
|
||||
TransactionOptions options = 2;
|
||||
}
|
||||
|
||||
// The response for [Firestore.BeginTransaction][google.firestore.v1beta1.Firestore.BeginTransaction].
|
||||
message BeginTransactionResponse {
|
||||
// The transaction that was started.
|
||||
bytes transaction = 1;
|
||||
}
|
||||
|
||||
// The request for [Firestore.Commit][google.firestore.v1beta1.Firestore.Commit].
|
||||
message CommitRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The writes to apply.
|
||||
//
|
||||
// Always executed atomically and in order.
|
||||
repeated Write writes = 2;
|
||||
|
||||
// If set, applies all writes in this transaction, and commits it.
|
||||
bytes transaction = 3;
|
||||
}
|
||||
|
||||
// The response for [Firestore.Commit][google.firestore.v1beta1.Firestore.Commit].
|
||||
message CommitResponse {
|
||||
// The result of applying the writes.
|
||||
//
|
||||
// This i-th write result corresponds to the i-th write in the
|
||||
// request.
|
||||
repeated WriteResult write_results = 1;
|
||||
|
||||
// The time at which the commit occurred. Any read with an equal or greater
|
||||
// `read_time` is guaranteed to see the effects of the commit.
|
||||
google.protobuf.Timestamp commit_time = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.Rollback][google.firestore.v1beta1.Firestore.Rollback].
|
||||
message RollbackRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// Required. The transaction to roll back.
|
||||
bytes transaction = 2 [(google.api.field_behavior) = REQUIRED];
|
||||
}
|
||||
|
||||
// The request for [Firestore.RunQuery][google.firestore.v1beta1.Firestore.RunQuery].
|
||||
message RunQueryRequest {
|
||||
// Required. The parent resource name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents` or
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// For example:
|
||||
// `projects/my-project/databases/my-database/documents` or
|
||||
// `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The query to run.
|
||||
oneof query_type {
|
||||
// A structured query.
|
||||
StructuredQuery structured_query = 2;
|
||||
}
|
||||
|
||||
// The consistency mode for this transaction.
|
||||
// If not set, defaults to strong consistency.
|
||||
oneof consistency_selector {
|
||||
// Reads documents in a transaction.
|
||||
bytes transaction = 5;
|
||||
|
||||
// Starts a new transaction and reads the documents.
|
||||
// Defaults to a read-only transaction.
|
||||
// The new transaction ID will be returned as the first response in the
|
||||
// stream.
|
||||
TransactionOptions new_transaction = 6;
|
||||
|
||||
// Reads documents as they were at the given time.
|
||||
// This may not be older than 270 seconds.
|
||||
google.protobuf.Timestamp read_time = 7;
|
||||
}
|
||||
}
|
||||
|
||||
// The response for [Firestore.RunQuery][google.firestore.v1beta1.Firestore.RunQuery].
|
||||
message RunQueryResponse {
|
||||
// The transaction that was started as part of this request.
|
||||
// Can only be set in the first response, and only if
|
||||
// [RunQueryRequest.new_transaction][google.firestore.v1beta1.RunQueryRequest.new_transaction] was set in the request.
|
||||
// If set, no other fields will be set in this response.
|
||||
bytes transaction = 2;
|
||||
|
||||
// A query result.
|
||||
// Not set when reporting partial progress.
|
||||
Document document = 1;
|
||||
|
||||
// The time at which the document was read. This may be monotonically
|
||||
// increasing; in this case, the previous documents in the result stream are
|
||||
// guaranteed not to have changed between their `read_time` and this one.
|
||||
//
|
||||
// If the query returns no results, a response with `read_time` and no
|
||||
// `document` will be sent, and this represents the time at which the query
|
||||
// was run.
|
||||
google.protobuf.Timestamp read_time = 3;
|
||||
|
||||
// The number of results that have been skipped due to an offset between
|
||||
// the last response and the current response.
|
||||
int32 skipped_results = 4;
|
||||
}
|
||||
|
||||
// The request for [Firestore.PartitionQuery][google.firestore.v1beta1.Firestore.PartitionQuery].
|
||||
message PartitionQueryRequest {
|
||||
// Required. The parent resource name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents`.
|
||||
// Document resource names are not supported; only database resource names
|
||||
// can be specified.
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The query to partition.
|
||||
oneof query_type {
|
||||
// A structured query.
|
||||
// Query must specify collection with all descendants and be ordered by name
|
||||
// ascending. Other filters, order bys, limits, offsets, and start/end
|
||||
// cursors are not supported.
|
||||
StructuredQuery structured_query = 2;
|
||||
}
|
||||
|
||||
// The desired maximum number of partition points.
|
||||
// The partitions may be returned across multiple pages of results.
|
||||
// The number must be positive. The actual number of partitions
|
||||
// returned may be fewer.
|
||||
//
|
||||
// For example, this may be set to one fewer than the number of parallel
|
||||
// queries to be run, or in running a data pipeline job, one fewer than the
|
||||
// number of workers or compute instances available.
|
||||
int64 partition_count = 3;
|
||||
|
||||
// The `next_page_token` value returned from a previous call to
|
||||
// PartitionQuery that may be used to get an additional set of results.
|
||||
// There are no ordering guarantees between sets of results. Thus, using
|
||||
// multiple sets of results will require merging the different result sets.
|
||||
//
|
||||
// For example, two subsequent calls using a page_token may return:
|
||||
//
|
||||
// * cursor B, cursor M, cursor Q
|
||||
// * cursor A, cursor U, cursor W
|
||||
//
|
||||
// To obtain a complete result set ordered with respect to the results of the
|
||||
// query supplied to PartitionQuery, the results sets should be merged:
|
||||
// cursor A, cursor B, cursor M, cursor Q, cursor U, cursor W
|
||||
string page_token = 4;
|
||||
|
||||
// The maximum number of partitions to return in this call, subject to
|
||||
// `partition_count`.
|
||||
//
|
||||
// For example, if `partition_count` = 10 and `page_size` = 8, the first call
|
||||
// to PartitionQuery will return up to 8 partitions and a `next_page_token`
|
||||
// if more results exist. A second call to PartitionQuery will return up to
|
||||
// 2 partitions, to complete the total of 10 specified in `partition_count`.
|
||||
int32 page_size = 5;
|
||||
}
|
||||
|
||||
// The response for [Firestore.PartitionQuery][google.firestore.v1beta1.Firestore.PartitionQuery].
|
||||
message PartitionQueryResponse {
|
||||
// Partition results.
|
||||
// Each partition is a split point that can be used by RunQuery as a starting
|
||||
// or end point for the query results. The RunQuery requests must be made with
|
||||
// the same query supplied to this PartitionQuery request. The partition
|
||||
// cursors will be ordered according to same ordering as the results of the
|
||||
// query supplied to PartitionQuery.
|
||||
//
|
||||
// For example, if a PartitionQuery request returns partition cursors A and B,
|
||||
// running the following three queries will return the entire result set of
|
||||
// the original query:
|
||||
//
|
||||
// * query, end_at A
|
||||
// * query, start_at A, end_at B
|
||||
// * query, start_at B
|
||||
//
|
||||
// An empty result may indicate that the query has too few results to be
|
||||
// partitioned.
|
||||
repeated Cursor partitions = 1;
|
||||
|
||||
// A page token that may be used to request an additional set of results, up
|
||||
// to the number specified by `partition_count` in the PartitionQuery request.
|
||||
// If blank, there are no more results.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.Write][google.firestore.v1beta1.Firestore.Write].
|
||||
//
|
||||
// The first request creates a stream, or resumes an existing one from a token.
|
||||
//
|
||||
// When creating a new stream, the server replies with a response containing
|
||||
// only an ID and a token, to use in the next request.
|
||||
//
|
||||
// When resuming a stream, the server first streams any responses later than the
|
||||
// given token, then a response containing only an up-to-date token, to use in
|
||||
// the next request.
|
||||
message WriteRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
// This is only required in the first message.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The ID of the write stream to resume.
|
||||
// This may only be set in the first message. When left empty, a new write
|
||||
// stream will be created.
|
||||
string stream_id = 2;
|
||||
|
||||
// The writes to apply.
|
||||
//
|
||||
// Always executed atomically and in order.
|
||||
// This must be empty on the first request.
|
||||
// This may be empty on the last request.
|
||||
// This must not be empty on all other requests.
|
||||
repeated Write writes = 3;
|
||||
|
||||
// A stream token that was previously sent by the server.
|
||||
//
|
||||
// The client should set this field to the token from the most recent
|
||||
// [WriteResponse][google.firestore.v1beta1.WriteResponse] it has received. This acknowledges that the client has
|
||||
// received responses up to this token. After sending this token, earlier
|
||||
// tokens may not be used anymore.
|
||||
//
|
||||
// The server may close the stream if there are too many unacknowledged
|
||||
// responses.
|
||||
//
|
||||
// Leave this field unset when creating a new stream. To resume a stream at
|
||||
// a specific point, set this field and the `stream_id` field.
|
||||
//
|
||||
// Leave this field unset when creating a new stream.
|
||||
bytes stream_token = 4;
|
||||
|
||||
// Labels associated with this write request.
|
||||
map<string, string> labels = 5;
|
||||
}
|
||||
|
||||
// The response for [Firestore.Write][google.firestore.v1beta1.Firestore.Write].
|
||||
message WriteResponse {
|
||||
// The ID of the stream.
|
||||
// Only set on the first message, when a new stream was created.
|
||||
string stream_id = 1;
|
||||
|
||||
// A token that represents the position of this response in the stream.
|
||||
// This can be used by a client to resume the stream at this point.
|
||||
//
|
||||
// This field is always set.
|
||||
bytes stream_token = 2;
|
||||
|
||||
// The result of applying the writes.
|
||||
//
|
||||
// This i-th write result corresponds to the i-th write in the
|
||||
// request.
|
||||
repeated WriteResult write_results = 3;
|
||||
|
||||
// The time at which the commit occurred. Any read with an equal or greater
|
||||
// `read_time` is guaranteed to see the effects of the write.
|
||||
google.protobuf.Timestamp commit_time = 4;
|
||||
}
|
||||
|
||||
// A request for [Firestore.Listen][google.firestore.v1beta1.Firestore.Listen]
|
||||
message ListenRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The supported target changes.
|
||||
oneof target_change {
|
||||
// A target to add to this stream.
|
||||
Target add_target = 2;
|
||||
|
||||
// The ID of a target to remove from this stream.
|
||||
int32 remove_target = 3;
|
||||
}
|
||||
|
||||
// Labels associated with this target change.
|
||||
map<string, string> labels = 4;
|
||||
}
|
||||
|
||||
// The response for [Firestore.Listen][google.firestore.v1beta1.Firestore.Listen].
|
||||
message ListenResponse {
|
||||
// The supported responses.
|
||||
oneof response_type {
|
||||
// Targets have changed.
|
||||
TargetChange target_change = 2;
|
||||
|
||||
// A [Document][google.firestore.v1beta1.Document] has changed.
|
||||
DocumentChange document_change = 3;
|
||||
|
||||
// A [Document][google.firestore.v1beta1.Document] has been deleted.
|
||||
DocumentDelete document_delete = 4;
|
||||
|
||||
// A [Document][google.firestore.v1beta1.Document] has been removed from a target (because it is no longer
|
||||
// relevant to that target).
|
||||
DocumentRemove document_remove = 6;
|
||||
|
||||
// A filter to apply to the set of documents previously returned for the
|
||||
// given target.
|
||||
//
|
||||
// Returned when documents may have been removed from the given target, but
|
||||
// the exact documents are unknown.
|
||||
ExistenceFilter filter = 5;
|
||||
}
|
||||
}
|
||||
|
||||
// A specification of a set of documents to listen to.
|
||||
message Target {
|
||||
// A target specified by a set of documents names.
|
||||
message DocumentsTarget {
|
||||
// The names of the documents to retrieve. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// The request will fail if any of the document is not a child resource of
|
||||
// the given `database`. Duplicate names will be elided.
|
||||
repeated string documents = 2;
|
||||
}
|
||||
|
||||
// A target specified by a query.
|
||||
message QueryTarget {
|
||||
// The parent resource name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents` or
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// For example:
|
||||
// `projects/my-project/databases/my-database/documents` or
|
||||
// `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
string parent = 1;
|
||||
|
||||
// The query to run.
|
||||
oneof query_type {
|
||||
// A structured query.
|
||||
StructuredQuery structured_query = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// The type of target to listen to.
|
||||
oneof target_type {
|
||||
// A target specified by a query.
|
||||
QueryTarget query = 2;
|
||||
|
||||
// A target specified by a set of document names.
|
||||
DocumentsTarget documents = 3;
|
||||
}
|
||||
|
||||
// When to start listening.
|
||||
//
|
||||
// If not specified, all matching Documents are returned before any
|
||||
// subsequent changes.
|
||||
oneof resume_type {
|
||||
// A resume token from a prior [TargetChange][google.firestore.v1beta1.TargetChange] for an identical target.
|
||||
//
|
||||
// Using a resume token with a different target is unsupported and may fail.
|
||||
bytes resume_token = 4;
|
||||
|
||||
// Start listening after a specific `read_time`.
|
||||
//
|
||||
// The client must know the state of matching documents at this time.
|
||||
google.protobuf.Timestamp read_time = 11;
|
||||
}
|
||||
|
||||
// The target ID that identifies the target on the stream. Must be a positive
|
||||
// number and non-zero.
|
||||
int32 target_id = 5;
|
||||
|
||||
// If the target should be removed once it is current and consistent.
|
||||
bool once = 6;
|
||||
}
|
||||
|
||||
// Targets being watched have changed.
|
||||
message TargetChange {
|
||||
// The type of change.
|
||||
enum TargetChangeType {
|
||||
// No change has occurred. Used only to send an updated `resume_token`.
|
||||
NO_CHANGE = 0;
|
||||
|
||||
// The targets have been added.
|
||||
ADD = 1;
|
||||
|
||||
// The targets have been removed.
|
||||
REMOVE = 2;
|
||||
|
||||
// The targets reflect all changes committed before the targets were added
|
||||
// to the stream.
|
||||
//
|
||||
// This will be sent after or with a `read_time` that is greater than or
|
||||
// equal to the time at which the targets were added.
|
||||
//
|
||||
// Listeners can wait for this change if read-after-write semantics
|
||||
// are desired.
|
||||
CURRENT = 3;
|
||||
|
||||
// The targets have been reset, and a new initial state for the targets
|
||||
// will be returned in subsequent changes.
|
||||
//
|
||||
// After the initial state is complete, `CURRENT` will be returned even
|
||||
// if the target was previously indicated to be `CURRENT`.
|
||||
RESET = 4;
|
||||
}
|
||||
|
||||
// The type of change that occurred.
|
||||
TargetChangeType target_change_type = 1;
|
||||
|
||||
// The target IDs of targets that have changed.
|
||||
//
|
||||
// If empty, the change applies to all targets.
|
||||
//
|
||||
// The order of the target IDs is not defined.
|
||||
repeated int32 target_ids = 2;
|
||||
|
||||
// The error that resulted in this change, if applicable.
|
||||
google.rpc.Status cause = 3;
|
||||
|
||||
// A token that can be used to resume the stream for the given `target_ids`,
|
||||
// or all targets if `target_ids` is empty.
|
||||
//
|
||||
// Not set on every target change.
|
||||
bytes resume_token = 4;
|
||||
|
||||
// The consistent `read_time` for the given `target_ids` (omitted when the
|
||||
// target_ids are not at a consistent snapshot).
|
||||
//
|
||||
// The stream is guaranteed to send a `read_time` with `target_ids` empty
|
||||
// whenever the entire stream reaches a new consistent snapshot. ADD,
|
||||
// CURRENT, and RESET messages are guaranteed to (eventually) result in a
|
||||
// new consistent snapshot (while NO_CHANGE and REMOVE messages are not).
|
||||
//
|
||||
// For a given stream, `read_time` is guaranteed to be monotonically
|
||||
// increasing.
|
||||
google.protobuf.Timestamp read_time = 6;
|
||||
}
|
||||
|
||||
// The request for [Firestore.ListCollectionIds][google.firestore.v1beta1.Firestore.ListCollectionIds].
|
||||
message ListCollectionIdsRequest {
|
||||
// Required. The parent document. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
// For example:
|
||||
// `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
string parent = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The maximum number of results to return.
|
||||
int32 page_size = 2;
|
||||
|
||||
// A page token. Must be a value from
|
||||
// [ListCollectionIdsResponse][google.firestore.v1beta1.ListCollectionIdsResponse].
|
||||
string page_token = 3;
|
||||
}
|
||||
|
||||
// The response from [Firestore.ListCollectionIds][google.firestore.v1beta1.Firestore.ListCollectionIds].
|
||||
message ListCollectionIdsResponse {
|
||||
// The collection ids.
|
||||
repeated string collection_ids = 1;
|
||||
|
||||
// A page token that may be used to continue the list.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request for [Firestore.BatchWrite][google.firestore.v1beta1.Firestore.BatchWrite].
|
||||
message BatchWriteRequest {
|
||||
// Required. The database name. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}`.
|
||||
string database = 1 [(google.api.field_behavior) = REQUIRED];
|
||||
|
||||
// The writes to apply.
|
||||
//
|
||||
// Method does not apply writes atomically and does not guarantee ordering.
|
||||
// Each write succeeds or fails independently. You cannot write to the same
|
||||
// document more than once per request.
|
||||
repeated Write writes = 2;
|
||||
|
||||
// Labels associated with this batch write.
|
||||
map<string, string> labels = 3;
|
||||
}
|
||||
|
||||
// The response from [Firestore.BatchWrite][google.firestore.v1beta1.Firestore.BatchWrite].
|
||||
message BatchWriteResponse {
|
||||
// The result of applying the writes.
|
||||
//
|
||||
// This i-th write result corresponds to the i-th write in the
|
||||
// request.
|
||||
repeated WriteResult write_results = 1;
|
||||
|
||||
// The status of applying the writes.
|
||||
//
|
||||
// This i-th write status corresponds to the i-th write in the
|
||||
// request.
|
||||
repeated google.rpc.Status status = 2;
|
||||
}
|
||||
Generated
Vendored
+301
@@ -0,0 +1,301 @@
|
||||
// Copyright 2021 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.firestore.v1beta1;
|
||||
|
||||
import "google/firestore/v1beta1/document.proto";
|
||||
import "google/protobuf/wrappers.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1Beta1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1beta1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "QueryProto";
|
||||
option java_package = "com.google.firestore.v1beta1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1beta1";
|
||||
|
||||
// A Firestore query.
|
||||
message StructuredQuery {
|
||||
// A selection of a collection, such as `messages as m1`.
|
||||
message CollectionSelector {
|
||||
// The collection ID.
|
||||
// When set, selects only collections with this ID.
|
||||
string collection_id = 2;
|
||||
|
||||
// When false, selects only collections that are immediate children of
|
||||
// the `parent` specified in the containing `RunQueryRequest`.
|
||||
// When true, selects all descendant collections.
|
||||
bool all_descendants = 3;
|
||||
}
|
||||
|
||||
// A filter.
|
||||
message Filter {
|
||||
// The type of filter.
|
||||
oneof filter_type {
|
||||
// A composite filter.
|
||||
CompositeFilter composite_filter = 1;
|
||||
|
||||
// A filter on a document field.
|
||||
FieldFilter field_filter = 2;
|
||||
|
||||
// A filter that takes exactly one argument.
|
||||
UnaryFilter unary_filter = 3;
|
||||
}
|
||||
}
|
||||
|
||||
// A filter that merges multiple other filters using the given operator.
|
||||
message CompositeFilter {
|
||||
// A composite filter operator.
|
||||
enum Operator {
|
||||
// Unspecified. This value must not be used.
|
||||
OPERATOR_UNSPECIFIED = 0;
|
||||
|
||||
// The results are required to satisfy each of the combined filters.
|
||||
AND = 1;
|
||||
}
|
||||
|
||||
// The operator for combining multiple filters.
|
||||
Operator op = 1;
|
||||
|
||||
// The list of filters to combine.
|
||||
// Must contain at least one filter.
|
||||
repeated Filter filters = 2;
|
||||
}
|
||||
|
||||
// A filter on a specific field.
|
||||
message FieldFilter {
|
||||
// A field filter operator.
|
||||
enum Operator {
|
||||
// Unspecified. This value must not be used.
|
||||
OPERATOR_UNSPECIFIED = 0;
|
||||
|
||||
// The given `field` is less than the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `field` come first in `order_by`.
|
||||
LESS_THAN = 1;
|
||||
|
||||
// The given `field` is less than or equal to the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `field` come first in `order_by`.
|
||||
LESS_THAN_OR_EQUAL = 2;
|
||||
|
||||
// The given `field` is greater than the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `field` come first in `order_by`.
|
||||
GREATER_THAN = 3;
|
||||
|
||||
// The given `field` is greater than or equal to the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `field` come first in `order_by`.
|
||||
GREATER_THAN_OR_EQUAL = 4;
|
||||
|
||||
// The given `field` is equal to the given `value`.
|
||||
EQUAL = 5;
|
||||
|
||||
// The given `field` is not equal to the given `value`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * No other `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`.
|
||||
// * That `field` comes first in the `order_by`.
|
||||
NOT_EQUAL = 6;
|
||||
|
||||
// The given `field` is an array that contains the given `value`.
|
||||
ARRAY_CONTAINS = 7;
|
||||
|
||||
// The given `field` is equal to at least one value in the given array.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `value` is a non-empty `ArrayValue` with at most 10 values.
|
||||
// * No other `IN` or `ARRAY_CONTAINS_ANY` or `NOT_IN`.
|
||||
IN = 8;
|
||||
|
||||
// The given `field` is an array that contains any of the values in the
|
||||
// given array.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `value` is a non-empty `ArrayValue` with at most 10 values.
|
||||
// * No other `IN` or `ARRAY_CONTAINS_ANY` or `NOT_IN`.
|
||||
ARRAY_CONTAINS_ANY = 9;
|
||||
|
||||
// The value of the `field` is not in the given array.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * That `value` is a non-empty `ArrayValue` with at most 10 values.
|
||||
// * No other `IN`, `ARRAY_CONTAINS_ANY`, `NOT_IN`, `NOT_EQUAL`,
|
||||
// `IS_NOT_NULL`, or `IS_NOT_NAN`.
|
||||
// * That `field` comes first in the `order_by`.
|
||||
NOT_IN = 10;
|
||||
}
|
||||
|
||||
// The field to filter by.
|
||||
FieldReference field = 1;
|
||||
|
||||
// The operator to filter by.
|
||||
Operator op = 2;
|
||||
|
||||
// The value to compare to.
|
||||
Value value = 3;
|
||||
}
|
||||
|
||||
// A filter with a single operand.
|
||||
message UnaryFilter {
|
||||
// A unary operator.
|
||||
enum Operator {
|
||||
// Unspecified. This value must not be used.
|
||||
OPERATOR_UNSPECIFIED = 0;
|
||||
|
||||
// The given `field` is equal to `NaN`.
|
||||
IS_NAN = 2;
|
||||
|
||||
// The given `field` is equal to `NULL`.
|
||||
IS_NULL = 3;
|
||||
|
||||
// The given `field` is not equal to `NaN`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * No other `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`.
|
||||
// * That `field` comes first in the `order_by`.
|
||||
IS_NOT_NAN = 4;
|
||||
|
||||
// The given `field` is not equal to `NULL`.
|
||||
//
|
||||
// Requires:
|
||||
//
|
||||
// * A single `NOT_EQUAL`, `NOT_IN`, `IS_NOT_NULL`, or `IS_NOT_NAN`.
|
||||
// * That `field` comes first in the `order_by`.
|
||||
IS_NOT_NULL = 5;
|
||||
}
|
||||
|
||||
// The unary operator to apply.
|
||||
Operator op = 1;
|
||||
|
||||
// The argument to the filter.
|
||||
oneof operand_type {
|
||||
// The field to which to apply the operator.
|
||||
FieldReference field = 2;
|
||||
}
|
||||
}
|
||||
|
||||
// A reference to a field, such as `max(messages.time) as max_time`.
|
||||
message FieldReference {
|
||||
string field_path = 2;
|
||||
}
|
||||
|
||||
// An order on a field.
|
||||
message Order {
|
||||
// The field to order by.
|
||||
FieldReference field = 1;
|
||||
|
||||
// The direction to order by. Defaults to `ASCENDING`.
|
||||
Direction direction = 2;
|
||||
}
|
||||
|
||||
// The projection of document's fields to return.
|
||||
message Projection {
|
||||
// The fields to return.
|
||||
//
|
||||
// If empty, all fields are returned. To only return the name
|
||||
// of the document, use `['__name__']`.
|
||||
repeated FieldReference fields = 2;
|
||||
}
|
||||
|
||||
// A sort direction.
|
||||
enum Direction {
|
||||
// Unspecified.
|
||||
DIRECTION_UNSPECIFIED = 0;
|
||||
|
||||
// Ascending.
|
||||
ASCENDING = 1;
|
||||
|
||||
// Descending.
|
||||
DESCENDING = 2;
|
||||
}
|
||||
|
||||
// The projection to return.
|
||||
Projection select = 1;
|
||||
|
||||
// The collections to query.
|
||||
repeated CollectionSelector from = 2;
|
||||
|
||||
// The filter to apply.
|
||||
Filter where = 3;
|
||||
|
||||
// The order to apply to the query results.
|
||||
//
|
||||
// Firestore guarantees a stable ordering through the following rules:
|
||||
//
|
||||
// * Any field required to appear in `order_by`, that is not already
|
||||
// specified in `order_by`, is appended to the order in field name order
|
||||
// by default.
|
||||
// * If an order on `__name__` is not specified, it is appended by default.
|
||||
//
|
||||
// Fields are appended with the same sort direction as the last order
|
||||
// specified, or 'ASCENDING' if no order was specified. For example:
|
||||
//
|
||||
// * `SELECT * FROM Foo ORDER BY A` becomes
|
||||
// `SELECT * FROM Foo ORDER BY A, __name__`
|
||||
// * `SELECT * FROM Foo ORDER BY A DESC` becomes
|
||||
// `SELECT * FROM Foo ORDER BY A DESC, __name__ DESC`
|
||||
// * `SELECT * FROM Foo WHERE A > 1` becomes
|
||||
// `SELECT * FROM Foo WHERE A > 1 ORDER BY A, __name__`
|
||||
repeated Order order_by = 4;
|
||||
|
||||
// A starting point for the query results.
|
||||
Cursor start_at = 7;
|
||||
|
||||
// A end point for the query results.
|
||||
Cursor end_at = 8;
|
||||
|
||||
// The number of results to skip.
|
||||
//
|
||||
// Applies before limit, but after all other constraints. Must be >= 0 if
|
||||
// specified.
|
||||
int32 offset = 6;
|
||||
|
||||
// The maximum number of results to return.
|
||||
//
|
||||
// Applies after all other constraints.
|
||||
// Must be >= 0 if specified.
|
||||
google.protobuf.Int32Value limit = 5;
|
||||
}
|
||||
|
||||
// A position in a query result set.
|
||||
message Cursor {
|
||||
// The values that represent a position, in the order they appear in
|
||||
// the order by clause of a query.
|
||||
//
|
||||
// Can contain fewer values than specified in the order by clause.
|
||||
repeated Value values = 1;
|
||||
|
||||
// If the position is just before or just after the given values, relative
|
||||
// to the sort order defined by the query.
|
||||
bool before = 2;
|
||||
}
|
||||
Generated
Vendored
+259
@@ -0,0 +1,259 @@
|
||||
// Copyright 2021 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.firestore.v1beta1;
|
||||
|
||||
import "google/firestore/v1beta1/common.proto";
|
||||
import "google/firestore/v1beta1/document.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "Google.Cloud.Firestore.V1Beta1";
|
||||
option go_package = "google.golang.org/genproto/googleapis/firestore/v1beta1;firestore";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "WriteProto";
|
||||
option java_package = "com.google.firestore.v1beta1";
|
||||
option objc_class_prefix = "GCFS";
|
||||
option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
|
||||
option ruby_package = "Google::Cloud::Firestore::V1beta1";
|
||||
|
||||
// A write on a document.
|
||||
message Write {
|
||||
// The operation to execute.
|
||||
oneof operation {
|
||||
// A document to write.
|
||||
Document update = 1;
|
||||
|
||||
// A document name to delete. In the format:
|
||||
// `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
string delete = 2;
|
||||
|
||||
// Applies a transformation to a document.
|
||||
DocumentTransform transform = 6;
|
||||
}
|
||||
|
||||
// The fields to update in this write.
|
||||
//
|
||||
// This field can be set only when the operation is `update`.
|
||||
// If the mask is not set for an `update` and the document exists, any
|
||||
// existing data will be overwritten.
|
||||
// If the mask is set and the document on the server has fields not covered by
|
||||
// the mask, they are left unchanged.
|
||||
// Fields referenced in the mask, but not present in the input document, are
|
||||
// deleted from the document on the server.
|
||||
// The field paths in this mask must not contain a reserved field name.
|
||||
DocumentMask update_mask = 3;
|
||||
|
||||
// The transforms to perform after update.
|
||||
//
|
||||
// This field can be set only when the operation is `update`. If present, this
|
||||
// write is equivalent to performing `update` and `transform` to the same
|
||||
// document atomically and in order.
|
||||
repeated DocumentTransform.FieldTransform update_transforms = 7;
|
||||
|
||||
// An optional precondition on the document.
|
||||
//
|
||||
// The write will fail if this is set and not met by the target document.
|
||||
Precondition current_document = 4;
|
||||
}
|
||||
|
||||
// A transformation of a document.
|
||||
message DocumentTransform {
|
||||
// A transformation of a field of the document.
|
||||
message FieldTransform {
|
||||
// A value that is calculated by the server.
|
||||
enum ServerValue {
|
||||
// Unspecified. This value must not be used.
|
||||
SERVER_VALUE_UNSPECIFIED = 0;
|
||||
|
||||
// The time at which the server processed the request, with millisecond
|
||||
// precision. If used on multiple fields (same or different documents) in
|
||||
// a transaction, all the fields will get the same server timestamp.
|
||||
REQUEST_TIME = 1;
|
||||
}
|
||||
|
||||
// The path of the field. See [Document.fields][google.firestore.v1beta1.Document.fields] for the field path syntax
|
||||
// reference.
|
||||
string field_path = 1;
|
||||
|
||||
// The transformation to apply on the field.
|
||||
oneof transform_type {
|
||||
// Sets the field to the given server value.
|
||||
ServerValue set_to_server_value = 2;
|
||||
|
||||
// Adds the given value to the field's current value.
|
||||
//
|
||||
// This must be an integer or a double value.
|
||||
// If the field is not an integer or double, or if the field does not yet
|
||||
// exist, the transformation will set the field to the given value.
|
||||
// If either of the given value or the current field value are doubles,
|
||||
// both values will be interpreted as doubles. Double arithmetic and
|
||||
// representation of double values follow IEEE 754 semantics.
|
||||
// If there is positive/negative integer overflow, the field is resolved
|
||||
// to the largest magnitude positive/negative integer.
|
||||
Value increment = 3;
|
||||
|
||||
// Sets the field to the maximum of its current value and the given value.
|
||||
//
|
||||
// This must be an integer or a double value.
|
||||
// If the field is not an integer or double, or if the field does not yet
|
||||
// exist, the transformation will set the field to the given value.
|
||||
// If a maximum operation is applied where the field and the input value
|
||||
// are of mixed types (that is - one is an integer and one is a double)
|
||||
// the field takes on the type of the larger operand. If the operands are
|
||||
// equivalent (e.g. 3 and 3.0), the field does not change.
|
||||
// 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and
|
||||
// zero input value is always the stored value.
|
||||
// The maximum of any numeric value x and NaN is NaN.
|
||||
Value maximum = 4;
|
||||
|
||||
// Sets the field to the minimum of its current value and the given value.
|
||||
//
|
||||
// This must be an integer or a double value.
|
||||
// If the field is not an integer or double, or if the field does not yet
|
||||
// exist, the transformation will set the field to the input value.
|
||||
// If a minimum operation is applied where the field and the input value
|
||||
// are of mixed types (that is - one is an integer and one is a double)
|
||||
// the field takes on the type of the smaller operand. If the operands are
|
||||
// equivalent (e.g. 3 and 3.0), the field does not change.
|
||||
// 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and
|
||||
// zero input value is always the stored value.
|
||||
// The minimum of any numeric value x and NaN is NaN.
|
||||
Value minimum = 5;
|
||||
|
||||
// Append the given elements in order if they are not already present in
|
||||
// the current field value.
|
||||
// If the field is not an array, or if the field does not yet exist, it is
|
||||
// first set to the empty array.
|
||||
//
|
||||
// Equivalent numbers of different types (e.g. 3L and 3.0) are
|
||||
// considered equal when checking if a value is missing.
|
||||
// NaN is equal to NaN, and Null is equal to Null.
|
||||
// If the input contains multiple equivalent values, only the first will
|
||||
// be considered.
|
||||
//
|
||||
// The corresponding transform_result will be the null value.
|
||||
ArrayValue append_missing_elements = 6;
|
||||
|
||||
// Remove all of the given elements from the array in the field.
|
||||
// If the field is not an array, or if the field does not yet exist, it is
|
||||
// set to the empty array.
|
||||
//
|
||||
// Equivalent numbers of the different types (e.g. 3L and 3.0) are
|
||||
// considered equal when deciding whether an element should be removed.
|
||||
// NaN is equal to NaN, and Null is equal to Null.
|
||||
// This will remove all equivalent values if there are duplicates.
|
||||
//
|
||||
// The corresponding transform_result will be the null value.
|
||||
ArrayValue remove_all_from_array = 7;
|
||||
}
|
||||
}
|
||||
|
||||
// The name of the document to transform.
|
||||
string document = 1;
|
||||
|
||||
// The list of transformations to apply to the fields of the document, in
|
||||
// order.
|
||||
// This must not be empty.
|
||||
repeated FieldTransform field_transforms = 2;
|
||||
}
|
||||
|
||||
// The result of applying a write.
|
||||
message WriteResult {
|
||||
// The last update time of the document after applying the write. Not set
|
||||
// after a `delete`.
|
||||
//
|
||||
// If the write did not actually change the document, this will be the
|
||||
// previous update_time.
|
||||
google.protobuf.Timestamp update_time = 1;
|
||||
|
||||
// The results of applying each [DocumentTransform.FieldTransform][google.firestore.v1beta1.DocumentTransform.FieldTransform], in the
|
||||
// same order.
|
||||
repeated Value transform_results = 2;
|
||||
}
|
||||
|
||||
// A [Document][google.firestore.v1beta1.Document] has changed.
|
||||
//
|
||||
// May be the result of multiple [writes][google.firestore.v1beta1.Write], including deletes, that
|
||||
// ultimately resulted in a new value for the [Document][google.firestore.v1beta1.Document].
|
||||
//
|
||||
// Multiple [DocumentChange][google.firestore.v1beta1.DocumentChange] messages may be returned for the same logical
|
||||
// change, if multiple targets are affected.
|
||||
message DocumentChange {
|
||||
// The new state of the [Document][google.firestore.v1beta1.Document].
|
||||
//
|
||||
// If `mask` is set, contains only fields that were updated or added.
|
||||
Document document = 1;
|
||||
|
||||
// A set of target IDs of targets that match this document.
|
||||
repeated int32 target_ids = 5;
|
||||
|
||||
// A set of target IDs for targets that no longer match this document.
|
||||
repeated int32 removed_target_ids = 6;
|
||||
}
|
||||
|
||||
// A [Document][google.firestore.v1beta1.Document] has been deleted.
|
||||
//
|
||||
// May be the result of multiple [writes][google.firestore.v1beta1.Write], including updates, the
|
||||
// last of which deleted the [Document][google.firestore.v1beta1.Document].
|
||||
//
|
||||
// Multiple [DocumentDelete][google.firestore.v1beta1.DocumentDelete] messages may be returned for the same logical
|
||||
// delete, if multiple targets are affected.
|
||||
message DocumentDelete {
|
||||
// The resource name of the [Document][google.firestore.v1beta1.Document] that was deleted.
|
||||
string document = 1;
|
||||
|
||||
// A set of target IDs for targets that previously matched this entity.
|
||||
repeated int32 removed_target_ids = 6;
|
||||
|
||||
// The read timestamp at which the delete was observed.
|
||||
//
|
||||
// Greater or equal to the `commit_time` of the delete.
|
||||
google.protobuf.Timestamp read_time = 4;
|
||||
}
|
||||
|
||||
// A [Document][google.firestore.v1beta1.Document] has been removed from the view of the targets.
|
||||
//
|
||||
// Sent if the document is no longer relevant to a target and is out of view.
|
||||
// Can be sent instead of a DocumentDelete or a DocumentChange if the server
|
||||
// can not send the new value of the document.
|
||||
//
|
||||
// Multiple [DocumentRemove][google.firestore.v1beta1.DocumentRemove] messages may be returned for the same logical
|
||||
// write or delete, if multiple targets are affected.
|
||||
message DocumentRemove {
|
||||
// The resource name of the [Document][google.firestore.v1beta1.Document] that has gone out of view.
|
||||
string document = 1;
|
||||
|
||||
// A set of target IDs for targets that previously matched this document.
|
||||
repeated int32 removed_target_ids = 2;
|
||||
|
||||
// The read timestamp at which the remove was observed.
|
||||
//
|
||||
// Greater or equal to the `commit_time` of the change/delete/remove.
|
||||
google.protobuf.Timestamp read_time = 4;
|
||||
}
|
||||
|
||||
// A digest of all the documents that match a given target.
|
||||
message ExistenceFilter {
|
||||
// The target ID to which this filter applies.
|
||||
int32 target_id = 1;
|
||||
|
||||
// The total count of documents that match [target_id][google.firestore.v1beta1.ExistenceFilter.target_id].
|
||||
//
|
||||
// If different from the count of documents in the client that match, the
|
||||
// client must manually determine which documents no longer match the target.
|
||||
int32 count = 2;
|
||||
}
|
||||
Generated
Vendored
+247
@@ -0,0 +1,247 @@
|
||||
// Copyright 2020 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.longrunning;
|
||||
|
||||
import "google/api/annotations.proto";
|
||||
import "google/api/client.proto";
|
||||
import "google/protobuf/any.proto";
|
||||
import "google/protobuf/duration.proto";
|
||||
import "google/protobuf/empty.proto";
|
||||
import "google/rpc/status.proto";
|
||||
import "google/protobuf/descriptor.proto";
|
||||
|
||||
option cc_enable_arenas = true;
|
||||
option csharp_namespace = "Google.LongRunning";
|
||||
option go_package = "google.golang.org/genproto/googleapis/longrunning;longrunning";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "OperationsProto";
|
||||
option java_package = "com.google.longrunning";
|
||||
option php_namespace = "Google\\LongRunning";
|
||||
|
||||
extend google.protobuf.MethodOptions {
|
||||
// Additional information regarding long-running operations.
|
||||
// In particular, this specifies the types that are returned from
|
||||
// long-running operations.
|
||||
//
|
||||
// Required for methods that return `google.longrunning.Operation`; invalid
|
||||
// otherwise.
|
||||
google.longrunning.OperationInfo operation_info = 1049;
|
||||
}
|
||||
|
||||
// Manages long-running operations with an API service.
|
||||
//
|
||||
// When an API method normally takes long time to complete, it can be designed
|
||||
// to return [Operation][google.longrunning.Operation] to the client, and the client can use this
|
||||
// interface to receive the real response asynchronously by polling the
|
||||
// operation resource, or pass the operation resource to another API (such as
|
||||
// Google Cloud Pub/Sub API) to receive the response. Any API service that
|
||||
// returns long-running operations should implement the `Operations` interface
|
||||
// so developers can have a consistent client experience.
|
||||
service Operations {
|
||||
option (google.api.default_host) = "longrunning.googleapis.com";
|
||||
|
||||
// Lists operations that match the specified filter in the request. If the
|
||||
// server doesn't support this method, it returns `UNIMPLEMENTED`.
|
||||
//
|
||||
// NOTE: the `name` binding allows API services to override the binding
|
||||
// to use different resource name schemes, such as `users/*/operations`. To
|
||||
// override the binding, API services can add a binding such as
|
||||
// `"/v1/{name=users/*}/operations"` to their service configuration.
|
||||
// For backwards compatibility, the default name includes the operations
|
||||
// collection id, however overriding users must ensure the name binding
|
||||
// is the parent resource, without the operations collection id.
|
||||
rpc ListOperations(ListOperationsRequest) returns (ListOperationsResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1/{name=operations}"
|
||||
};
|
||||
option (google.api.method_signature) = "name,filter";
|
||||
}
|
||||
|
||||
// Gets the latest state of a long-running operation. Clients can use this
|
||||
// method to poll the operation result at intervals as recommended by the API
|
||||
// service.
|
||||
rpc GetOperation(GetOperationRequest) returns (Operation) {
|
||||
option (google.api.http) = {
|
||||
get: "/v1/{name=operations/**}"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
}
|
||||
|
||||
// Deletes a long-running operation. This method indicates that the client is
|
||||
// no longer interested in the operation result. It does not cancel the
|
||||
// operation. If the server doesn't support this method, it returns
|
||||
// `google.rpc.Code.UNIMPLEMENTED`.
|
||||
rpc DeleteOperation(DeleteOperationRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
delete: "/v1/{name=operations/**}"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
}
|
||||
|
||||
// Starts asynchronous cancellation on a long-running operation. The server
|
||||
// makes a best effort to cancel the operation, but success is not
|
||||
// guaranteed. If the server doesn't support this method, it returns
|
||||
// `google.rpc.Code.UNIMPLEMENTED`. Clients can use
|
||||
// [Operations.GetOperation][google.longrunning.Operations.GetOperation] or
|
||||
// other methods to check whether the cancellation succeeded or whether the
|
||||
// operation completed despite cancellation. On successful cancellation,
|
||||
// the operation is not deleted; instead, it becomes an operation with
|
||||
// an [Operation.error][google.longrunning.Operation.error] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1,
|
||||
// corresponding to `Code.CANCELLED`.
|
||||
rpc CancelOperation(CancelOperationRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/v1/{name=operations/**}:cancel"
|
||||
body: "*"
|
||||
};
|
||||
option (google.api.method_signature) = "name";
|
||||
}
|
||||
|
||||
// Waits until the specified long-running operation is done or reaches at most
|
||||
// a specified timeout, returning the latest state. If the operation is
|
||||
// already done, the latest state is immediately returned. If the timeout
|
||||
// specified is greater than the default HTTP/RPC timeout, the HTTP/RPC
|
||||
// timeout is used. If the server does not support this method, it returns
|
||||
// `google.rpc.Code.UNIMPLEMENTED`.
|
||||
// Note that this method is on a best-effort basis. It may return the latest
|
||||
// state before the specified timeout (including immediately), meaning even an
|
||||
// immediate response is no guarantee that the operation is done.
|
||||
rpc WaitOperation(WaitOperationRequest) returns (Operation) {
|
||||
}
|
||||
}
|
||||
|
||||
// This resource represents a long-running operation that is the result of a
|
||||
// network API call.
|
||||
message Operation {
|
||||
// The server-assigned name, which is only unique within the same service that
|
||||
// originally returns it. If you use the default HTTP mapping, the
|
||||
// `name` should be a resource name ending with `operations/{unique_id}`.
|
||||
string name = 1;
|
||||
|
||||
// Service-specific metadata associated with the operation. It typically
|
||||
// contains progress information and common metadata such as create time.
|
||||
// Some services might not provide such metadata. Any method that returns a
|
||||
// long-running operation should document the metadata type, if any.
|
||||
google.protobuf.Any metadata = 2;
|
||||
|
||||
// If the value is `false`, it means the operation is still in progress.
|
||||
// If `true`, the operation is completed, and either `error` or `response` is
|
||||
// available.
|
||||
bool done = 3;
|
||||
|
||||
// The operation result, which can be either an `error` or a valid `response`.
|
||||
// If `done` == `false`, neither `error` nor `response` is set.
|
||||
// If `done` == `true`, exactly one of `error` or `response` is set.
|
||||
oneof result {
|
||||
// The error result of the operation in case of failure or cancellation.
|
||||
google.rpc.Status error = 4;
|
||||
|
||||
// The normal response of the operation in case of success. If the original
|
||||
// method returns no data on success, such as `Delete`, the response is
|
||||
// `google.protobuf.Empty`. If the original method is standard
|
||||
// `Get`/`Create`/`Update`, the response should be the resource. For other
|
||||
// methods, the response should have the type `XxxResponse`, where `Xxx`
|
||||
// is the original method name. For example, if the original method name
|
||||
// is `TakeSnapshot()`, the inferred response type is
|
||||
// `TakeSnapshotResponse`.
|
||||
google.protobuf.Any response = 5;
|
||||
}
|
||||
}
|
||||
|
||||
// The request message for [Operations.GetOperation][google.longrunning.Operations.GetOperation].
|
||||
message GetOperationRequest {
|
||||
// The name of the operation resource.
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
// The request message for [Operations.ListOperations][google.longrunning.Operations.ListOperations].
|
||||
message ListOperationsRequest {
|
||||
// The name of the operation's parent resource.
|
||||
string name = 4;
|
||||
|
||||
// The standard list filter.
|
||||
string filter = 1;
|
||||
|
||||
// The standard list page size.
|
||||
int32 page_size = 2;
|
||||
|
||||
// The standard list page token.
|
||||
string page_token = 3;
|
||||
}
|
||||
|
||||
// The response message for [Operations.ListOperations][google.longrunning.Operations.ListOperations].
|
||||
message ListOperationsResponse {
|
||||
// A list of operations that matches the specified filter in the request.
|
||||
repeated Operation operations = 1;
|
||||
|
||||
// The standard List next-page token.
|
||||
string next_page_token = 2;
|
||||
}
|
||||
|
||||
// The request message for [Operations.CancelOperation][google.longrunning.Operations.CancelOperation].
|
||||
message CancelOperationRequest {
|
||||
// The name of the operation resource to be cancelled.
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
// The request message for [Operations.DeleteOperation][google.longrunning.Operations.DeleteOperation].
|
||||
message DeleteOperationRequest {
|
||||
// The name of the operation resource to be deleted.
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
// The request message for [Operations.WaitOperation][google.longrunning.Operations.WaitOperation].
|
||||
message WaitOperationRequest {
|
||||
// The name of the operation resource to wait on.
|
||||
string name = 1;
|
||||
|
||||
// The maximum duration to wait before timing out. If left blank, the wait
|
||||
// will be at most the time permitted by the underlying HTTP/RPC protocol.
|
||||
// If RPC context deadline is also specified, the shorter one will be used.
|
||||
google.protobuf.Duration timeout = 2;
|
||||
}
|
||||
|
||||
// A message representing the message types used by a long-running operation.
|
||||
//
|
||||
// Example:
|
||||
//
|
||||
// rpc LongRunningRecognize(LongRunningRecognizeRequest)
|
||||
// returns (google.longrunning.Operation) {
|
||||
// option (google.longrunning.operation_info) = {
|
||||
// response_type: "LongRunningRecognizeResponse"
|
||||
// metadata_type: "LongRunningRecognizeMetadata"
|
||||
// };
|
||||
// }
|
||||
message OperationInfo {
|
||||
// Required. The message name of the primary return type for this
|
||||
// long-running operation.
|
||||
// This type will be used to deserialize the LRO's response.
|
||||
//
|
||||
// If the response is in a different package from the rpc, a fully-qualified
|
||||
// message name must be used (e.g. `google.protobuf.Struct`).
|
||||
//
|
||||
// Note: Altering this value constitutes a breaking change.
|
||||
string response_type = 1;
|
||||
|
||||
// Required. The message name of the metadata type for this long-running
|
||||
// operation.
|
||||
//
|
||||
// If the response is in a different package from the rpc, a fully-qualified
|
||||
// message name must be used (e.g. `google.protobuf.Struct`).
|
||||
//
|
||||
// Note: Altering this value constitutes a breaking change.
|
||||
string metadata_type = 2;
|
||||
}
|
||||
+158
@@ -0,0 +1,158 @@
|
||||
// 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 csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||
option go_package = "google.golang.org/protobuf/types/known/anypb";
|
||||
option java_package = "com.google.protobuf";
|
||||
option java_outer_classname = "AnyProto";
|
||||
option java_multiple_files = true;
|
||||
option objc_class_prefix = "GPB";
|
||||
|
||||
// `Any` contains an arbitrary serialized protocol buffer message along with a
|
||||
// URL that describes the type of the serialized message.
|
||||
//
|
||||
// Protobuf library provides support to pack/unpack Any values in the form
|
||||
// of utility functions or additional generated methods of the Any type.
|
||||
//
|
||||
// Example 1: Pack and unpack a message in C++.
|
||||
//
|
||||
// Foo foo = ...;
|
||||
// Any any;
|
||||
// any.PackFrom(foo);
|
||||
// ...
|
||||
// if (any.UnpackTo(&foo)) {
|
||||
// ...
|
||||
// }
|
||||
//
|
||||
// Example 2: Pack and unpack a message in Java.
|
||||
//
|
||||
// Foo foo = ...;
|
||||
// Any any = Any.pack(foo);
|
||||
// ...
|
||||
// if (any.is(Foo.class)) {
|
||||
// foo = any.unpack(Foo.class);
|
||||
// }
|
||||
//
|
||||
// Example 3: Pack and unpack a message in Python.
|
||||
//
|
||||
// foo = Foo(...)
|
||||
// any = Any()
|
||||
// any.Pack(foo)
|
||||
// ...
|
||||
// if any.Is(Foo.DESCRIPTOR):
|
||||
// any.Unpack(foo)
|
||||
// ...
|
||||
//
|
||||
// Example 4: Pack and unpack a message in Go
|
||||
//
|
||||
// foo := &pb.Foo{...}
|
||||
// any, err := anypb.New(foo)
|
||||
// if err != nil {
|
||||
// ...
|
||||
// }
|
||||
// ...
|
||||
// foo := &pb.Foo{}
|
||||
// if err := any.UnmarshalTo(foo); err != nil {
|
||||
// ...
|
||||
// }
|
||||
//
|
||||
// The pack methods provided by protobuf library will by default use
|
||||
// 'type.googleapis.com/full.type.name' as the type URL and the unpack
|
||||
// methods only use the fully qualified type name after the last '/'
|
||||
// in the type URL, for example "foo.bar.com/x/y.z" will yield type
|
||||
// name "y.z".
|
||||
//
|
||||
//
|
||||
// JSON
|
||||
// ====
|
||||
// The JSON representation of an `Any` value uses the regular
|
||||
// representation of the deserialized, embedded message, with an
|
||||
// additional field `@type` which contains the type URL. Example:
|
||||
//
|
||||
// package google.profile;
|
||||
// message Person {
|
||||
// string first_name = 1;
|
||||
// string last_name = 2;
|
||||
// }
|
||||
//
|
||||
// {
|
||||
// "@type": "type.googleapis.com/google.profile.Person",
|
||||
// "firstName": <string>,
|
||||
// "lastName": <string>
|
||||
// }
|
||||
//
|
||||
// If the embedded message type is well-known and has a custom JSON
|
||||
// representation, that representation will be embedded adding a field
|
||||
// `value` which holds the custom JSON in addition to the `@type`
|
||||
// field. Example (for message [google.protobuf.Duration][]):
|
||||
//
|
||||
// {
|
||||
// "@type": "type.googleapis.com/google.protobuf.Duration",
|
||||
// "value": "1.212s"
|
||||
// }
|
||||
//
|
||||
message Any {
|
||||
// A URL/resource name that uniquely identifies the type of the serialized
|
||||
// protocol buffer message. This string must contain at least
|
||||
// one "/" character. The last segment of the URL's path must represent
|
||||
// the fully qualified name of the type (as in
|
||||
// `path/google.protobuf.Duration`). The name should be in a canonical form
|
||||
// (e.g., leading "." is not accepted).
|
||||
//
|
||||
// In practice, teams usually precompile into the binary all types that they
|
||||
// expect it to use in the context of Any. However, for URLs which use the
|
||||
// scheme `http`, `https`, or no scheme, one can optionally set up a type
|
||||
// server that maps type URLs to message definitions as follows:
|
||||
//
|
||||
// * If no scheme is provided, `https` is assumed.
|
||||
// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
|
||||
// value in binary format, or produce an error.
|
||||
// * Applications are allowed to cache lookup results based on the
|
||||
// URL, or have them precompiled into a binary to avoid any
|
||||
// lookup. Therefore, binary compatibility needs to be preserved
|
||||
// on changes to types. (Use versioned type names to manage
|
||||
// breaking changes.)
|
||||
//
|
||||
// Note: this functionality is not currently available in the official
|
||||
// protobuf release, and it is not used for type URLs beginning with
|
||||
// type.googleapis.com.
|
||||
//
|
||||
// Schemes other than `http`, `https` (or the empty scheme) might be
|
||||
// used with implementation specific semantics.
|
||||
//
|
||||
string type_url = 1;
|
||||
|
||||
// Must be a valid serialized protocol buffer of the above specified type.
|
||||
bytes value = 2;
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
// 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 csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||
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 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);
|
||||
// }
|
||||
//
|
||||
// The JSON representation for `Empty` is empty JSON object `{}`.
|
||||
message Empty {}
|
||||
Generated
Vendored
+245
@@ -0,0 +1,245 @@
|
||||
// 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 csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||
option java_package = "com.google.protobuf";
|
||||
option java_outer_classname = "FieldMaskProto";
|
||||
option java_multiple_files = true;
|
||||
option objc_class_prefix = "GPB";
|
||||
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.
|
||||
//
|
||||
// In order to reset a field's value to the default, the field must
|
||||
// be in the mask and set to the default value in the provided resource.
|
||||
// Hence, in order to reset all fields of a resource, provide a default
|
||||
// instance of the resource and set all fields in the mask, or do
|
||||
// not provide a mask as described below.
|
||||
//
|
||||
// If a field mask is not present on update, the operation applies to
|
||||
// all fields (as if a field mask of all fields has been specified).
|
||||
// Note that in the presence of schema evolution, this may mean that
|
||||
// fields the client does not know and has therefore not filled into
|
||||
// the request will be reset to their default. If this is unwanted
|
||||
// behavior, a specific service may require a client to always specify
|
||||
// a field mask, producing an error if not.
|
||||
//
|
||||
// As with get operations, the location of the resource which
|
||||
// describes the updated values in the request message depends on the
|
||||
// operation kind. In any case, the effect of the field mask is
|
||||
// required to be honored by the API.
|
||||
//
|
||||
// ## 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;
|
||||
}
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
// 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 csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||
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";
|
||||
|
||||
// `Struct` represents a structured data value, consisting of fields
|
||||
// which map to dynamically typed values. In some languages, `Struct`
|
||||
// might be supported by a native representation. For example, in
|
||||
// scripting languages like JS a struct is represented as an
|
||||
// object. The details of that representation are described together
|
||||
// with the proto support for the language.
|
||||
//
|
||||
// The JSON representation for `Struct` is JSON object.
|
||||
message Struct {
|
||||
// Unordered map of dynamically typed values.
|
||||
map<string, Value> fields = 1;
|
||||
}
|
||||
|
||||
// `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 that
|
||||
// variants, absence of any variant indicates an error.
|
||||
//
|
||||
// The JSON representation for `Value` is JSON value.
|
||||
message Value {
|
||||
// The kind of value.
|
||||
oneof kind {
|
||||
// Represents a null value.
|
||||
NullValue null_value = 1;
|
||||
// Represents a double value.
|
||||
double number_value = 2;
|
||||
// Represents a string value.
|
||||
string string_value = 3;
|
||||
// Represents a boolean value.
|
||||
bool bool_value = 4;
|
||||
// Represents a structured value.
|
||||
Struct struct_value = 5;
|
||||
// Represents a repeated `Value`.
|
||||
ListValue list_value = 6;
|
||||
}
|
||||
}
|
||||
|
||||
// `NullValue` is a singleton enumeration to represent the null value for the
|
||||
// `Value` type union.
|
||||
//
|
||||
// The JSON representation for `NullValue` is JSON `null`.
|
||||
enum NullValue {
|
||||
// Null value.
|
||||
NULL_VALUE = 0;
|
||||
}
|
||||
|
||||
// `ListValue` is a wrapper around a repeated field of values.
|
||||
//
|
||||
// The JSON representation for `ListValue` is JSON array.
|
||||
message ListValue {
|
||||
// Repeated field of dynamically typed values.
|
||||
repeated Value values = 1;
|
||||
}
|
||||
Generated
Vendored
+147
@@ -0,0 +1,147 @@
|
||||
// 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 csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||
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";
|
||||
|
||||
// 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 proto3 JSON serializer should always use UTC (as indicated by
|
||||
// "Z") when printing the Timestamp type and a proto3 JSON 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://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D
|
||||
// ) 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 from 0001-01-01T00:00:00Z to
|
||||
// 9999-12-31T23:59:59Z inclusive.
|
||||
int64 seconds = 1;
|
||||
|
||||
// Non-negative fractions of a second at nanosecond resolution. Negative
|
||||
// second values with fractions must still have non-negative nanos values
|
||||
// that count forward in time. Must be from 0 to 999,999,999
|
||||
// inclusive.
|
||||
int32 nanos = 2;
|
||||
}
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
// 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.
|
||||
|
||||
// Wrappers for primitive (non-message) types. These types are useful
|
||||
// for embedding primitives in the `google.protobuf.Any` type and for places
|
||||
// where we need to distinguish between the absence of a primitive
|
||||
// typed field and its default value.
|
||||
//
|
||||
// These wrappers have no meaningful use within repeated fields as they lack
|
||||
// the ability to detect presence on individual elements.
|
||||
// These wrappers have no meaningful use within a map or a oneof since
|
||||
// individual entries of a map or fields of a oneof can already detect presence.
|
||||
|
||||
syntax = "proto3";
|
||||
|
||||
package google.protobuf;
|
||||
|
||||
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
|
||||
option cc_enable_arenas = true;
|
||||
option go_package = "google.golang.org/protobuf/types/known/wrapperspb";
|
||||
option java_package = "com.google.protobuf";
|
||||
option java_outer_classname = "WrappersProto";
|
||||
option java_multiple_files = true;
|
||||
option objc_class_prefix = "GPB";
|
||||
|
||||
// Wrapper message for `double`.
|
||||
//
|
||||
// The JSON representation for `DoubleValue` is JSON number.
|
||||
message DoubleValue {
|
||||
// The double value.
|
||||
double value = 1;
|
||||
}
|
||||
|
||||
// Wrapper message for `float`.
|
||||
//
|
||||
// The JSON representation for `FloatValue` is JSON number.
|
||||
message FloatValue {
|
||||
// The float value.
|
||||
float value = 1;
|
||||
}
|
||||
|
||||
// Wrapper message for `int64`.
|
||||
//
|
||||
// The JSON representation for `Int64Value` is JSON string.
|
||||
message Int64Value {
|
||||
// The int64 value.
|
||||
int64 value = 1;
|
||||
}
|
||||
|
||||
// Wrapper message for `uint64`.
|
||||
//
|
||||
// The JSON representation for `UInt64Value` is JSON string.
|
||||
message UInt64Value {
|
||||
// The uint64 value.
|
||||
uint64 value = 1;
|
||||
}
|
||||
|
||||
// Wrapper message for `int32`.
|
||||
//
|
||||
// The JSON representation for `Int32Value` is JSON number.
|
||||
message Int32Value {
|
||||
// The int32 value.
|
||||
int32 value = 1;
|
||||
}
|
||||
|
||||
// Wrapper message for `uint32`.
|
||||
//
|
||||
// The JSON representation for `UInt32Value` is JSON number.
|
||||
message UInt32Value {
|
||||
// The uint32 value.
|
||||
uint32 value = 1;
|
||||
}
|
||||
|
||||
// Wrapper message for `bool`.
|
||||
//
|
||||
// The JSON representation for `BoolValue` is JSON `true` and `false`.
|
||||
message BoolValue {
|
||||
// The bool value.
|
||||
bool value = 1;
|
||||
}
|
||||
|
||||
// Wrapper message for `string`.
|
||||
//
|
||||
// The JSON representation for `StringValue` is JSON string.
|
||||
message StringValue {
|
||||
// The string value.
|
||||
string value = 1;
|
||||
}
|
||||
|
||||
// Wrapper message for `bytes`.
|
||||
//
|
||||
// The JSON representation for `BytesValue` is JSON string.
|
||||
message BytesValue {
|
||||
// The bytes value.
|
||||
bytes value = 1;
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
// Copyright 2020 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.rpc;
|
||||
|
||||
import "google/protobuf/any.proto";
|
||||
|
||||
option cc_enable_arenas = true;
|
||||
option go_package = "google.golang.org/genproto/googleapis/rpc/status;status";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "StatusProto";
|
||||
option java_package = "com.google.rpc";
|
||||
option objc_class_prefix = "RPC";
|
||||
|
||||
// The `Status` type defines a logical error model that is suitable for
|
||||
// different programming environments, including REST APIs and RPC APIs. It is
|
||||
// used by [gRPC](https://github.com/grpc). Each `Status` message contains
|
||||
// three pieces of data: error code, error message, and error details.
|
||||
//
|
||||
// You can find out more about this error model and how to work with it in the
|
||||
// [API Design Guide](https://cloud.google.com/apis/design/errors).
|
||||
message Status {
|
||||
// The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].
|
||||
int32 code = 1;
|
||||
|
||||
// A developer-facing error message, which should be in English. Any
|
||||
// user-facing error message should be localized and sent in the
|
||||
// [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.
|
||||
string message = 2;
|
||||
|
||||
// A list of messages that carry the error details. There is a common set of
|
||||
// message types for APIs to use.
|
||||
repeated google.protobuf.Any details = 3;
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// Copyright 2021 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.type;
|
||||
|
||||
option cc_enable_arenas = true;
|
||||
option go_package = "google.golang.org/genproto/googleapis/type/latlng;latlng";
|
||||
option java_multiple_files = true;
|
||||
option java_outer_classname = "LatLngProto";
|
||||
option java_package = "com.google.type";
|
||||
option objc_class_prefix = "GTP";
|
||||
|
||||
// An object that represents a latitude/longitude pair. This is expressed as a
|
||||
// pair of doubles to represent degrees latitude and degrees longitude. Unless
|
||||
// specified otherwise, this must conform to the
|
||||
// <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
|
||||
// standard</a>. Values must be within normalized ranges.
|
||||
message LatLng {
|
||||
// The latitude in degrees. It must be in the range [-90.0, +90.0].
|
||||
double latitude = 1;
|
||||
|
||||
// The longitude in degrees. It must be in the range [-180.0, +180.0].
|
||||
double longitude = 2;
|
||||
}
|
||||
+5464
File diff suppressed because it is too large
Load Diff
+118
@@ -0,0 +1,118 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright 2018 Google Inc.
|
||||
#
|
||||
# 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.
|
||||
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
# Variables
|
||||
PROTOS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
WORK_DIR=`mktemp -d`
|
||||
|
||||
# deletes the temp directory on exit
|
||||
function cleanup {
|
||||
rm -rf "$WORK_DIR"
|
||||
echo "Deleted temp working directory $WORK_DIR"
|
||||
}
|
||||
|
||||
# register the cleanup function to be called on the EXIT signal
|
||||
trap cleanup EXIT
|
||||
|
||||
# Capture location of pbjs / pbts before we pushd.
|
||||
PBJS="$(npm bin)/pbjs"
|
||||
PBTS="$(npm bin)/pbts"
|
||||
|
||||
# Enter work dir
|
||||
pushd "$WORK_DIR"
|
||||
|
||||
# Clone necessary git repos.
|
||||
git clone --depth 1 https://github.com/googleapis/googleapis.git
|
||||
git clone --depth 1 https://github.com/google/protobuf.git
|
||||
|
||||
# Copy necessary protos.
|
||||
mkdir -p "${PROTOS_DIR}/google/api"
|
||||
cp googleapis/google/api/{annotations,client,field_behavior,http,resource}.proto \
|
||||
"${PROTOS_DIR}/google/api/"
|
||||
|
||||
mkdir -p "${PROTOS_DIR}/google/firestore/v1"
|
||||
cp googleapis/google/firestore/v1/*.proto \
|
||||
"${PROTOS_DIR}/google/firestore/v1/"
|
||||
|
||||
mkdir -p "${PROTOS_DIR}/google/firestore/v1beta1"
|
||||
cp googleapis/google/firestore/v1beta1/*.proto \
|
||||
"${PROTOS_DIR}/google/firestore/v1beta1/"
|
||||
|
||||
mkdir -p "${PROTOS_DIR}/google/firestore/admin/v1"
|
||||
cp googleapis/google/firestore/admin/v1/*.proto \
|
||||
"${PROTOS_DIR}/google/firestore/admin/v1/"
|
||||
|
||||
mkdir -p "${PROTOS_DIR}/google/longrunning"
|
||||
cp googleapis/google/longrunning/operations.proto \
|
||||
"${PROTOS_DIR}/google/longrunning/"
|
||||
|
||||
mkdir -p "${PROTOS_DIR}/google/rpc"
|
||||
cp googleapis/google/rpc/status.proto \
|
||||
"${PROTOS_DIR}/google/rpc/"
|
||||
|
||||
mkdir -p "${PROTOS_DIR}/google/type"
|
||||
cp googleapis/google/type/latlng.proto \
|
||||
"${PROTOS_DIR}/google/type/"
|
||||
|
||||
mkdir -p "${PROTOS_DIR}/google/protobuf"
|
||||
cp protobuf/src/google/protobuf/{any,empty,field_mask,struct,timestamp,wrappers}.proto \
|
||||
"${PROTOS_DIR}/google/protobuf/"
|
||||
|
||||
popd
|
||||
|
||||
# Generate the Protobuf typings
|
||||
PBJS_ARGS=( --proto_path=. \
|
||||
--js_out=import_style=commonjs,binary:library \
|
||||
--target=static-module \
|
||||
--no-create \
|
||||
--no-encode \
|
||||
--no-decode \
|
||||
--no-verify \
|
||||
--no-delimited \
|
||||
--force-enum-string)
|
||||
|
||||
"${PBJS}" "${PBJS_ARGS[@]}" -o firestore_v1_proto_api.js \
|
||||
-r firestore_v1 \
|
||||
"${PROTOS_DIR}/google/firestore/v1/*.proto" \
|
||||
"${PROTOS_DIR}/firestore/*.proto" \
|
||||
"${PROTOS_DIR}/google/protobuf/*.proto" "${PROTOS_DIR}/google/type/*.proto" \
|
||||
"${PROTOS_DIR}/google/rpc/*.proto" "${PROTOS_DIR}/google/api/*.proto" \
|
||||
"${PROTOS_DIR}/google/longrunning/*.proto"
|
||||
perl -pi -e 's/number\|Long/number\|string/g' firestore_v1_proto_api.js
|
||||
"${PBTS}" -o firestore_v1_proto_api.d.ts firestore_v1_proto_api.js
|
||||
|
||||
"${PBJS}" "${PBJS_ARGS[@]}" -o firestore_admin_v1_proto_api.js \
|
||||
-r firestore_admin_v1 \
|
||||
"${PROTOS_DIR}/google/firestore/admin/v1/*.proto" \
|
||||
"${PROTOS_DIR}/google/protobuf/*.proto" "${PROTOS_DIR}/google/type/*.proto" \
|
||||
"${PROTOS_DIR}/google/rpc/*.proto" "${PROTOS_DIR}/google/api/*.proto" \
|
||||
"${PROTOS_DIR}/google/longrunning/*.proto"
|
||||
perl -pi -e 's/number\|Long/number\|string/g' firestore_admin_v1_proto_api.js
|
||||
"${PBTS}" -o firestore_admin_v1_proto_api.d.ts firestore_admin_v1_proto_api.js
|
||||
|
||||
"${PBJS}" "${PBJS_ARGS[@]}" -o firestore_v1beta1_proto_api.js \
|
||||
-r firestore_v1beta1 \
|
||||
"${PROTOS_DIR}/google/firestore/v1beta1/*.proto" \
|
||||
"${PROTOS_DIR}/google/protobuf/*.proto" "${PROTOS_DIR}/google/type/*.proto" \
|
||||
"${PROTOS_DIR}/google/rpc/*.proto" "${PROTOS_DIR}/google/api/*.proto" \
|
||||
"${PROTOS_DIR}/google/longrunning/*.proto"
|
||||
perl -pi -e 's/number\|Long/number\|string/g' firestore_v1beta1_proto_api.js
|
||||
"${PBTS}" -o firestore_v1beta1_proto_api.d.ts firestore_v1beta1_proto_api.js
|
||||
|
||||
node ../../scripts/license.js *.d.ts *.js
|
||||
+178
@@ -0,0 +1,178 @@
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
/// <reference types="node" />
|
||||
/*!
|
||||
* The default initial backoff time in milliseconds after an error.
|
||||
* Set to 1s according to https://cloud.google.com/apis/design/errors.
|
||||
*/
|
||||
export declare const DEFAULT_BACKOFF_INITIAL_DELAY_MS = 1000;
|
||||
/*!
|
||||
* The default maximum backoff time in milliseconds.
|
||||
*/
|
||||
export declare const DEFAULT_BACKOFF_MAX_DELAY_MS: number;
|
||||
/*!
|
||||
* The default factor to increase the backup by after each failed attempt.
|
||||
*/
|
||||
export declare const DEFAULT_BACKOFF_FACTOR = 1.5;
|
||||
/*!
|
||||
* The maximum number of retries that will be attempted by backoff
|
||||
* before stopping all retry attempts.
|
||||
*/
|
||||
export declare const MAX_RETRY_ATTEMPTS = 10;
|
||||
/*!
|
||||
* The timeout handler used by `ExponentialBackoff` and `BulkWriter`.
|
||||
*/
|
||||
export declare let delayExecution: (f: () => void, ms: number) => NodeJS.Timeout;
|
||||
/**
|
||||
* Allows overriding of the timeout handler used by the exponential backoff
|
||||
* implementation. If not invoked, we default to `setTimeout()`.
|
||||
*
|
||||
* Used only in testing.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param {function} handler A handler than matches the API of `setTimeout()`.
|
||||
*/
|
||||
export declare function setTimeoutHandler(handler: (f: () => void, ms: number) => void): void;
|
||||
/**
|
||||
* Configuration object to adjust the delays of the exponential backoff
|
||||
* algorithm.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export interface ExponentialBackoffSetting {
|
||||
/** Optional override for the initial retry delay. */
|
||||
initialDelayMs?: number;
|
||||
/** Optional override for the exponential backoff factor. */
|
||||
backoffFactor?: number;
|
||||
/** Optional override for the maximum retry delay. */
|
||||
maxDelayMs?: number;
|
||||
/**
|
||||
* Optional override to control the itter factor by which to randomize
|
||||
* attempts (0 means no randomization, 1.0 means +/-50% randomization). It is
|
||||
* suggested not to exceed this range.
|
||||
*/
|
||||
jitterFactor?: number;
|
||||
}
|
||||
/**
|
||||
* A helper for running delayed tasks following an exponential backoff curve
|
||||
* between attempts.
|
||||
*
|
||||
* Each delay is made up of a "base" delay which follows the exponential
|
||||
* backoff curve, and a "jitter" (+/- 50% by default) that is calculated and
|
||||
* added to the base delay. This prevents clients from accidentally
|
||||
* synchronizing their delays causing spikes of load to the backend.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class ExponentialBackoff {
|
||||
/**
|
||||
* The initial delay (used as the base delay on the first retry attempt).
|
||||
* Note that jitter will still be applied, so the actual delay could be as
|
||||
* little as 0.5*initialDelayMs (based on a jitter factor of 1.0).
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private readonly initialDelayMs;
|
||||
/**
|
||||
* The multiplier to use to determine the extended base delay after each
|
||||
* attempt.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private readonly backoffFactor;
|
||||
/**
|
||||
* The maximum base delay after which no further backoff is performed.
|
||||
* Note that jitter will still be applied, so the actual delay could be as
|
||||
* much as 1.5*maxDelayMs (based on a jitter factor of 1.0).
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private readonly maxDelayMs;
|
||||
/**
|
||||
* The jitter factor that controls the random distribution of the backoff
|
||||
* points.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private readonly jitterFactor;
|
||||
/**
|
||||
* The number of retries that has been attempted.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _retryCount;
|
||||
/**
|
||||
* The backoff delay of the current attempt.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private currentBaseMs;
|
||||
/**
|
||||
* Whether we are currently waiting for backoff to complete.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private awaitingBackoffCompletion;
|
||||
constructor(options?: ExponentialBackoffSetting);
|
||||
/**
|
||||
* Resets the backoff delay and retry count.
|
||||
*
|
||||
* The very next backoffAndWait() will have no delay. If it is called again
|
||||
* (i.e. due to an error), initialDelayMs (plus jitter) will be used, and
|
||||
* subsequent ones will increase according to the backoffFactor.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
reset(): void;
|
||||
/**
|
||||
* Resets the backoff delay to the maximum delay (e.g. for use after a
|
||||
* RESOURCE_EXHAUSTED error).
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
resetToMax(): void;
|
||||
/**
|
||||
* Returns a promise that resolves after currentDelayMs, and increases the
|
||||
* delay for any subsequent attempts.
|
||||
*
|
||||
* @return A Promise that resolves when the current delay elapsed.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
backoffAndWait(): Promise<void>;
|
||||
get retryCount(): number;
|
||||
/**
|
||||
* Returns a randomized "jitter" delay based on the current base and jitter
|
||||
* factor.
|
||||
*
|
||||
* @returns {number} The jitter to apply based on the current delay.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private jitterDelayMs;
|
||||
}
|
||||
+219
@@ -0,0 +1,219 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const logger_1 = require("./logger");
|
||||
/*
|
||||
* @module firestore/backoff
|
||||
* @private
|
||||
* @internal
|
||||
*
|
||||
* Contains backoff logic to facilitate RPC error handling. This class derives
|
||||
* its implementation from the Firestore Mobile Web Client.
|
||||
*
|
||||
* @see https://github.com/firebase/firebase-js-sdk/blob/master/packages/firestore/src/remote/backoff.ts
|
||||
*/
|
||||
/*!
|
||||
* The default initial backoff time in milliseconds after an error.
|
||||
* Set to 1s according to https://cloud.google.com/apis/design/errors.
|
||||
*/
|
||||
exports.DEFAULT_BACKOFF_INITIAL_DELAY_MS = 1000;
|
||||
/*!
|
||||
* The default maximum backoff time in milliseconds.
|
||||
*/
|
||||
exports.DEFAULT_BACKOFF_MAX_DELAY_MS = 60 * 1000;
|
||||
/*!
|
||||
* The default factor to increase the backup by after each failed attempt.
|
||||
*/
|
||||
exports.DEFAULT_BACKOFF_FACTOR = 1.5;
|
||||
/*!
|
||||
* The default jitter to distribute the backoff attempts by (0 means no
|
||||
* randomization, 1.0 means +/-50% randomization).
|
||||
*/
|
||||
const DEFAULT_JITTER_FACTOR = 1.0;
|
||||
/*!
|
||||
* The maximum number of retries that will be attempted by backoff
|
||||
* before stopping all retry attempts.
|
||||
*/
|
||||
exports.MAX_RETRY_ATTEMPTS = 10;
|
||||
/*!
|
||||
* The timeout handler used by `ExponentialBackoff` and `BulkWriter`.
|
||||
*/
|
||||
exports.delayExecution = setTimeout;
|
||||
/**
|
||||
* Allows overriding of the timeout handler used by the exponential backoff
|
||||
* implementation. If not invoked, we default to `setTimeout()`.
|
||||
*
|
||||
* Used only in testing.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param {function} handler A handler than matches the API of `setTimeout()`.
|
||||
*/
|
||||
function setTimeoutHandler(handler) {
|
||||
exports.delayExecution = (f, ms) => {
|
||||
handler(f, ms);
|
||||
const timeout = {
|
||||
hasRef: () => {
|
||||
throw new Error('For tests only. Not Implemented');
|
||||
},
|
||||
ref: () => {
|
||||
throw new Error('For tests only. Not Implemented');
|
||||
},
|
||||
refresh: () => {
|
||||
throw new Error('For tests only. Not Implemented');
|
||||
},
|
||||
unref: () => {
|
||||
throw new Error('For tests only. Not Implemented');
|
||||
},
|
||||
[Symbol.toPrimitive]: () => {
|
||||
throw new Error('For tests only. Not Implemented');
|
||||
},
|
||||
};
|
||||
return timeout;
|
||||
};
|
||||
}
|
||||
exports.setTimeoutHandler = setTimeoutHandler;
|
||||
/**
|
||||
* A helper for running delayed tasks following an exponential backoff curve
|
||||
* between attempts.
|
||||
*
|
||||
* Each delay is made up of a "base" delay which follows the exponential
|
||||
* backoff curve, and a "jitter" (+/- 50% by default) that is calculated and
|
||||
* added to the base delay. This prevents clients from accidentally
|
||||
* synchronizing their delays causing spikes of load to the backend.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class ExponentialBackoff {
|
||||
constructor(options = {}) {
|
||||
/**
|
||||
* The number of retries that has been attempted.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._retryCount = 0;
|
||||
/**
|
||||
* The backoff delay of the current attempt.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this.currentBaseMs = 0;
|
||||
/**
|
||||
* Whether we are currently waiting for backoff to complete.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this.awaitingBackoffCompletion = false;
|
||||
this.initialDelayMs =
|
||||
options.initialDelayMs !== undefined
|
||||
? options.initialDelayMs
|
||||
: exports.DEFAULT_BACKOFF_INITIAL_DELAY_MS;
|
||||
this.backoffFactor =
|
||||
options.backoffFactor !== undefined
|
||||
? options.backoffFactor
|
||||
: exports.DEFAULT_BACKOFF_FACTOR;
|
||||
this.maxDelayMs =
|
||||
options.maxDelayMs !== undefined
|
||||
? options.maxDelayMs
|
||||
: exports.DEFAULT_BACKOFF_MAX_DELAY_MS;
|
||||
this.jitterFactor =
|
||||
options.jitterFactor !== undefined
|
||||
? options.jitterFactor
|
||||
: DEFAULT_JITTER_FACTOR;
|
||||
}
|
||||
/**
|
||||
* Resets the backoff delay and retry count.
|
||||
*
|
||||
* The very next backoffAndWait() will have no delay. If it is called again
|
||||
* (i.e. due to an error), initialDelayMs (plus jitter) will be used, and
|
||||
* subsequent ones will increase according to the backoffFactor.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
reset() {
|
||||
this._retryCount = 0;
|
||||
this.currentBaseMs = 0;
|
||||
}
|
||||
/**
|
||||
* Resets the backoff delay to the maximum delay (e.g. for use after a
|
||||
* RESOURCE_EXHAUSTED error).
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
resetToMax() {
|
||||
this.currentBaseMs = this.maxDelayMs;
|
||||
}
|
||||
/**
|
||||
* Returns a promise that resolves after currentDelayMs, and increases the
|
||||
* delay for any subsequent attempts.
|
||||
*
|
||||
* @return A Promise that resolves when the current delay elapsed.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
backoffAndWait() {
|
||||
if (this.awaitingBackoffCompletion) {
|
||||
return Promise.reject(new Error('A backoff operation is already in progress.'));
|
||||
}
|
||||
if (this.retryCount > exports.MAX_RETRY_ATTEMPTS) {
|
||||
return Promise.reject(new Error('Exceeded maximum number of retries allowed.'));
|
||||
}
|
||||
// First schedule using the current base (which may be 0 and should be
|
||||
// honored as such).
|
||||
const delayWithJitterMs = this.currentBaseMs + this.jitterDelayMs();
|
||||
if (this.currentBaseMs > 0) {
|
||||
logger_1.logger('ExponentialBackoff.backoffAndWait', null, `Backing off for ${delayWithJitterMs} ms ` +
|
||||
`(base delay: ${this.currentBaseMs} ms)`);
|
||||
}
|
||||
// Apply backoff factor to determine next delay and ensure it is within
|
||||
// bounds.
|
||||
this.currentBaseMs *= this.backoffFactor;
|
||||
this.currentBaseMs = Math.max(this.currentBaseMs, this.initialDelayMs);
|
||||
this.currentBaseMs = Math.min(this.currentBaseMs, this.maxDelayMs);
|
||||
this._retryCount += 1;
|
||||
return new Promise(resolve => {
|
||||
this.awaitingBackoffCompletion = true;
|
||||
exports.delayExecution(() => {
|
||||
this.awaitingBackoffCompletion = false;
|
||||
resolve();
|
||||
}, delayWithJitterMs);
|
||||
});
|
||||
}
|
||||
// Visible for testing.
|
||||
get retryCount() {
|
||||
return this._retryCount;
|
||||
}
|
||||
/**
|
||||
* Returns a randomized "jitter" delay based on the current base and jitter
|
||||
* factor.
|
||||
*
|
||||
* @returns {number} The jitter to apply based on the current delay.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
jitterDelayMs() {
|
||||
return (Math.random() - 0.5) * this.jitterFactor * this.currentBaseMs;
|
||||
}
|
||||
}
|
||||
exports.ExponentialBackoff = ExponentialBackoff;
|
||||
//# sourceMappingURL=backoff.js.map
|
||||
+498
@@ -0,0 +1,498 @@
|
||||
/*!
|
||||
* Copyright 2020 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { GoogleError } from 'google-gax';
|
||||
import { FieldPath, Firestore } from '.';
|
||||
import { RateLimiter } from './rate-limiter';
|
||||
import { Timestamp } from './timestamp';
|
||||
import { WriteBatch, WriteResult } from './write-batch';
|
||||
import GrpcStatus = FirebaseFirestore.GrpcStatus;
|
||||
/*!
|
||||
* The maximum number of writes can be can in a single batch that is being retried.
|
||||
*/
|
||||
export declare const RETRY_MAX_BATCH_SIZE = 10;
|
||||
/*!
|
||||
* The starting maximum number of operations per second as allowed by the
|
||||
* 500/50/5 rule.
|
||||
*
|
||||
* https://firebase.google.com/docs/firestore/best-practices#ramping_up_traffic.
|
||||
*/
|
||||
export declare const DEFAULT_INITIAL_OPS_PER_SECOND_LIMIT = 500;
|
||||
/*!
|
||||
* The maximum number of operations per second as allowed by the 500/50/5 rule.
|
||||
* By default the rate limiter will not exceed this value.
|
||||
*
|
||||
* https://firebase.google.com/docs/firestore/best-practices#ramping_up_traffic.
|
||||
*/
|
||||
export declare const DEFAULT_MAXIMUM_OPS_PER_SECOND_LIMIT = 10000;
|
||||
/*!
|
||||
* The default jitter to apply to the exponential backoff used in retries. For
|
||||
* example, a factor of 0.3 means a 30% jitter is applied.
|
||||
*/
|
||||
export declare const DEFAULT_JITTER_FACTOR = 0.3;
|
||||
/**
|
||||
* Represents a single write for BulkWriter, encapsulating operation dispatch
|
||||
* and error handling.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
declare class BulkWriterOperation {
|
||||
readonly ref: firestore.DocumentReference<unknown>;
|
||||
private readonly type;
|
||||
private readonly sendFn;
|
||||
private readonly errorFn;
|
||||
private readonly successFn;
|
||||
private deferred;
|
||||
private failedAttempts;
|
||||
private lastStatus?;
|
||||
private _backoffDuration;
|
||||
/** Whether flush() was called when this was the last enqueued operation. */
|
||||
private _flushed;
|
||||
/**
|
||||
* @param ref The document reference being written to.
|
||||
* @param type The type of operation that created this write.
|
||||
* @param sendFn A callback to invoke when the operation should be sent.
|
||||
* @param errorFn The user provided global error callback.
|
||||
* @param successFn The user provided global success callback.
|
||||
*/
|
||||
constructor(ref: firestore.DocumentReference<unknown>, type: 'create' | 'set' | 'update' | 'delete', sendFn: (op: BulkWriterOperation) => void, errorFn: (error: BulkWriterError) => boolean, successFn: (ref: firestore.DocumentReference<unknown>, result: WriteResult) => void);
|
||||
get promise(): Promise<WriteResult>;
|
||||
get backoffDuration(): number;
|
||||
markFlushed(): void;
|
||||
get flushed(): boolean;
|
||||
onError(error: GoogleError): void;
|
||||
private updateBackoffDuration;
|
||||
onSuccess(result: WriteResult): void;
|
||||
}
|
||||
/**
|
||||
* Used to represent a batch on the BatchQueue.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
declare class BulkCommitBatch extends WriteBatch {
|
||||
readonly docPaths: Set<string>;
|
||||
readonly pendingOps: Array<BulkWriterOperation>;
|
||||
private _maxBatchSize;
|
||||
constructor(firestore: Firestore, maxBatchSize: number);
|
||||
get maxBatchSize(): number;
|
||||
setMaxBatchSize(size: number): void;
|
||||
has(documentRef: firestore.DocumentReference<unknown>): boolean;
|
||||
bulkCommit(options?: {
|
||||
requestTag?: string;
|
||||
}): Promise<void>;
|
||||
/**
|
||||
* Helper to update data structures associated with the operation and returns
|
||||
* the result.
|
||||
*/
|
||||
processLastOperation(op: BulkWriterOperation): void;
|
||||
}
|
||||
/**
|
||||
* The error thrown when a BulkWriter operation fails.
|
||||
*
|
||||
* @class BulkWriterError
|
||||
*/
|
||||
export declare class BulkWriterError extends Error {
|
||||
/** The status code of the error. */
|
||||
readonly code: GrpcStatus;
|
||||
/** The error message of the error. */
|
||||
readonly message: string;
|
||||
/** The document reference the operation was performed on. */
|
||||
readonly documentRef: firestore.DocumentReference<unknown>;
|
||||
/** The type of operation performed. */
|
||||
readonly operationType: 'create' | 'set' | 'update' | 'delete';
|
||||
/** How many times this operation has been attempted unsuccessfully. */
|
||||
readonly failedAttempts: number;
|
||||
/** @hideconstructor */
|
||||
constructor(
|
||||
/** The status code of the error. */
|
||||
code: GrpcStatus,
|
||||
/** The error message of the error. */
|
||||
message: string,
|
||||
/** The document reference the operation was performed on. */
|
||||
documentRef: firestore.DocumentReference<unknown>,
|
||||
/** The type of operation performed. */
|
||||
operationType: 'create' | 'set' | 'update' | 'delete',
|
||||
/** How many times this operation has been attempted unsuccessfully. */
|
||||
failedAttempts: number);
|
||||
}
|
||||
/**
|
||||
* A Firestore BulkWriter that can be used to perform a large number of writes
|
||||
* in parallel.
|
||||
*
|
||||
* @class BulkWriter
|
||||
*/
|
||||
export declare class BulkWriter {
|
||||
private readonly firestore;
|
||||
/**
|
||||
* The maximum number of writes that can be in a single batch.
|
||||
* Visible for testing.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _maxBatchSize;
|
||||
/**
|
||||
* The batch that is currently used to schedule operations. Once this batch
|
||||
* reaches maximum capacity, a new batch is created.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _bulkCommitBatch;
|
||||
/**
|
||||
* A pointer to the tail of all active BulkWriter operations. This pointer
|
||||
* is advanced every time a new write is enqueued.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _lastOp;
|
||||
/**
|
||||
* Whether this BulkWriter instance has started to close. Afterwards, no
|
||||
* new operations can be enqueued, except for retry operations scheduled by
|
||||
* the error handler.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _closing;
|
||||
/**
|
||||
* Rate limiter used to throttle requests as per the 500/50/5 rule.
|
||||
* Visible for testing.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
readonly _rateLimiter: RateLimiter;
|
||||
/**
|
||||
* The number of pending operations enqueued on this BulkWriter instance.
|
||||
* An operation is considered pending if BulkWriter has sent it via RPC and
|
||||
* is awaiting the result.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _pendingOpsCount;
|
||||
/**
|
||||
* An array containing buffered BulkWriter operations after the maximum number
|
||||
* of pending operations has been enqueued.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _bufferedOperations;
|
||||
/**
|
||||
* Whether a custom error handler has been set. BulkWriter only swallows
|
||||
* errors if an error handler is set. Otherwise, an UnhandledPromiseRejection
|
||||
* is thrown by Node if an operation promise is rejected without being
|
||||
* handled.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _errorHandlerSet;
|
||||
_getBufferedOperationsCount(): number;
|
||||
_setMaxBatchSize(size: number): void;
|
||||
/**
|
||||
* The maximum number of pending operations that can be enqueued onto this
|
||||
* BulkWriter instance. Once the this number of writes have been enqueued,
|
||||
* subsequent writes are buffered.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _maxPendingOpCount;
|
||||
_setMaxPendingOpCount(newMax: number): void;
|
||||
/**
|
||||
* The user-provided callback to be run every time a BulkWriter operation
|
||||
* successfully completes.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _successFn;
|
||||
/**
|
||||
* The user-provided callback to be run every time a BulkWriter operation
|
||||
* fails.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _errorFn;
|
||||
/** @hideconstructor */
|
||||
constructor(firestore: Firestore, options?: firestore.BulkWriterOptions);
|
||||
/**
|
||||
* Create a document with the provided data. This single operation will fail
|
||||
* if a document exists at its location.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* created.
|
||||
* @param {T} data The object to serialize as the document.
|
||||
* @returns {Promise<WriteResult>} A promise that resolves with the result of
|
||||
* the write. If the write fails, the promise is rejected with a
|
||||
* [BulkWriterError]{@link BulkWriterError}.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
* let documentRef = firestore.collection('col').doc();
|
||||
*
|
||||
* bulkWriter
|
||||
* .create(documentRef, {foo: 'bar'})
|
||||
* .then(result => {
|
||||
* console.log('Successfully executed write at: ', result);
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.log('Write failed with: ', err);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
create<T>(documentRef: firestore.DocumentReference<T>, data: T): Promise<WriteResult>;
|
||||
/**
|
||||
* Delete a document from the database.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* deleted.
|
||||
* @param {Precondition=} precondition A precondition to enforce for this
|
||||
* delete.
|
||||
* @param {Timestamp=} precondition.lastUpdateTime If set, enforces that the
|
||||
* document was last updated at lastUpdateTime. Fails the batch if the
|
||||
* document doesn't exist or was last updated at a different time.
|
||||
* @returns {Promise<WriteResult>} A promise that resolves with the result of
|
||||
* the delete. If the delete fails, the promise is rejected with a
|
||||
* [BulkWriterError]{@link BulkWriterError}.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* bulkWriter
|
||||
* .delete(documentRef)
|
||||
* .then(result => {
|
||||
* console.log('Successfully deleted document');
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.log('Delete failed with: ', err);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
delete<T>(documentRef: firestore.DocumentReference<T>, precondition?: firestore.Precondition): Promise<WriteResult>;
|
||||
set<T>(documentRef: firestore.DocumentReference<T>, data: Partial<T>, options: firestore.SetOptions): Promise<WriteResult>;
|
||||
set<T>(documentRef: firestore.DocumentReference<T>, data: T): Promise<WriteResult>;
|
||||
/**
|
||||
* Update fields of the document referred to by the provided
|
||||
* [DocumentReference]{@link DocumentReference}. If the document doesn't yet
|
||||
* exist, the update fails and the entire batch will be rejected.
|
||||
*
|
||||
* The update() method accepts either an object with field paths encoded as
|
||||
* keys and field values encoded as values, or a variable number of arguments
|
||||
* that alternate between field paths and field values. Nested fields can be
|
||||
* updated by providing dot-separated field path strings or by providing
|
||||
* FieldPath objects.
|
||||
*
|
||||
*
|
||||
* A Precondition restricting this update can be specified as the last
|
||||
* argument.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* updated.
|
||||
* @param {UpdateData|string|FieldPath} dataOrField An object containing the
|
||||
* fields and values with which to update the document or the path of the
|
||||
* first field to update.
|
||||
* @param {...(Precondition|*|string|FieldPath)} preconditionOrValues - An
|
||||
* alternating list of field paths and values to update or a Precondition to
|
||||
* restrict this update
|
||||
* @returns {Promise<WriteResult>} A promise that resolves with the result of
|
||||
* the write. If the write fails, the promise is rejected with a
|
||||
* [BulkWriterError]{@link BulkWriterError}.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* bulkWriter
|
||||
* .update(documentRef, {foo: 'bar'})
|
||||
* .then(result => {
|
||||
* console.log('Successfully executed write at: ', result);
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.log('Write failed with: ', err);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
update<T>(documentRef: firestore.DocumentReference<T>, dataOrField: firestore.UpdateData | string | FieldPath, ...preconditionOrValues: Array<{
|
||||
lastUpdateTime?: Timestamp;
|
||||
} | unknown | string | FieldPath>): Promise<WriteResult>;
|
||||
/**
|
||||
* Callback function set by {@link BulkWriter#onWriteResult} that is run
|
||||
* every time a {@link BulkWriter} operation successfully completes.
|
||||
*
|
||||
* @callback BulkWriter~successCallback
|
||||
* @param {DocumentReference} documentRef The document reference the
|
||||
* operation was performed on
|
||||
* @param {WriteResult} result The server write time of the operation.
|
||||
*/
|
||||
/**
|
||||
* Attaches a listener that is run every time a BulkWriter operation
|
||||
* successfully completes.
|
||||
*
|
||||
* @param {BulkWriter~successCallback} successCallback A callback to be
|
||||
* called every time a BulkWriter operation successfully completes.
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter
|
||||
* .onWriteResult((documentRef, result) => {
|
||||
* console.log(
|
||||
* 'Successfully executed write on document: ',
|
||||
* documentRef,
|
||||
* ' at: ',
|
||||
* result
|
||||
* );
|
||||
* });
|
||||
*/
|
||||
onWriteResult(successCallback: (documentRef: firestore.DocumentReference<unknown>, result: WriteResult) => void): void;
|
||||
/**
|
||||
* Callback function set by {@link BulkWriter#onWriteError} that is run when
|
||||
* a write fails in order to determine whether {@link BulkWriter} should
|
||||
* retry the operation.
|
||||
*
|
||||
* @callback BulkWriter~shouldRetryCallback
|
||||
* @param {BulkWriterError} error The error object with information about the
|
||||
* operation and error.
|
||||
* @returns {boolean} Whether or not to retry the failed operation. Returning
|
||||
* `true` retries the operation. Returning `false` will stop the retry loop.
|
||||
*/
|
||||
/**
|
||||
* Attaches an error handler listener that is run every time a BulkWriter
|
||||
* operation fails.
|
||||
*
|
||||
* BulkWriter has a default error handler that retries UNAVAILABLE and
|
||||
* ABORTED errors up to a maximum of 10 failed attempts. When an error
|
||||
* handler is specified, the default error handler will be overwritten.
|
||||
*
|
||||
* @param shouldRetryCallback {BulkWriter~shouldRetryCallback} A callback to
|
||||
* be called every time a BulkWriter operation fails. Returning `true` will
|
||||
* retry the operation. Returning `false` will stop the retry loop.
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter
|
||||
* .onWriteError((error) => {
|
||||
* if (
|
||||
* error.code === GrpcStatus.UNAVAILABLE &&
|
||||
* error.failedAttempts < MAX_RETRY_ATTEMPTS
|
||||
* ) {
|
||||
* return true;
|
||||
* } else {
|
||||
* console.log('Failed write at document: ', error.documentRef);
|
||||
* return false;
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
onWriteError(shouldRetryCallback: (error: BulkWriterError) => boolean): void;
|
||||
/**
|
||||
* Commits all writes that have been enqueued up to this point in parallel.
|
||||
*
|
||||
* Returns a Promise that resolves when all currently queued operations have
|
||||
* been committed. The Promise will never be rejected since the results for
|
||||
* each individual operation are conveyed via their individual Promises.
|
||||
*
|
||||
* The Promise resolves immediately if there are no pending writes. Otherwise,
|
||||
* the Promise waits for all previously issued writes, but it does not wait
|
||||
* for writes that were added after the method is called. If you want to wait
|
||||
* for additional writes, call `flush()` again.
|
||||
*
|
||||
* @return {Promise<void>} A promise that resolves when all enqueued writes
|
||||
* up to this point have been committed.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter.create(documentRef, {foo: 'bar'});
|
||||
* bulkWriter.update(documentRef2, {foo: 'bar'});
|
||||
* bulkWriter.delete(documentRef3);
|
||||
* await flush().then(() => {
|
||||
* console.log('Executed all writes');
|
||||
* });
|
||||
*/
|
||||
flush(): Promise<void>;
|
||||
/**
|
||||
* Commits all enqueued writes and marks the BulkWriter instance as closed.
|
||||
*
|
||||
* After calling `close()`, calling any method will throw an error. Any
|
||||
* retries scheduled as part of an `onWriteError()` handler will be run
|
||||
* before the `close()` promise resolves.
|
||||
*
|
||||
* Returns a Promise that resolves when there are no more pending writes. The
|
||||
* Promise will never be rejected. Calling this method will send all requests.
|
||||
* The promise resolves immediately if there are no pending writes.
|
||||
*
|
||||
* @return {Promise<void>} A promise that resolves when all enqueued writes
|
||||
* up to this point have been committed.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter.create(documentRef, {foo: 'bar'});
|
||||
* bulkWriter.update(documentRef2, {foo: 'bar'});
|
||||
* bulkWriter.delete(documentRef3);
|
||||
* await close().then(() => {
|
||||
* console.log('Executed all writes');
|
||||
* });
|
||||
*/
|
||||
close(): Promise<void>;
|
||||
/**
|
||||
* Throws an error if the BulkWriter instance has been closed.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_verifyNotClosed(): void;
|
||||
/**
|
||||
* Sends the current batch and resets `this._bulkCommitBatch`.
|
||||
*
|
||||
* @param flush If provided, keeps re-sending operations until no more
|
||||
* operations are enqueued. This allows retries to resolve as part of a
|
||||
* `flush()` or `close()` call.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _scheduleCurrentBatch;
|
||||
/**
|
||||
* Sends the provided batch once the rate limiter does not require any delay.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _sendBatch;
|
||||
/**
|
||||
* Adds a 30% jitter to the provided backoff.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private static _applyJitter;
|
||||
/**
|
||||
* Schedules and runs the provided operation on the next available batch.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _enqueue;
|
||||
/**
|
||||
* Manages the pending operation counter and schedules the next BulkWriter
|
||||
* operation if we're under the maximum limit.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _processBufferedOps;
|
||||
/**
|
||||
* Schedules the provided operations on current BulkCommitBatch.
|
||||
* Sends the BulkCommitBatch if it reaches maximum capacity.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_sendFn(enqueueOnBatchCallback: (bulkCommitBatch: BulkCommitBatch) => void, op: BulkWriterOperation): void;
|
||||
}
|
||||
export {};
|
||||
+873
@@ -0,0 +1,873 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const assert = require("assert");
|
||||
const backoff_1 = require("./backoff");
|
||||
const rate_limiter_1 = require("./rate-limiter");
|
||||
const timestamp_1 = require("./timestamp");
|
||||
const util_1 = require("./util");
|
||||
const write_batch_1 = require("./write-batch");
|
||||
const validate_1 = require("./validate");
|
||||
const logger_1 = require("./logger");
|
||||
/*!
|
||||
* The maximum number of writes that can be in a single batch.
|
||||
*/
|
||||
const MAX_BATCH_SIZE = 20;
|
||||
/*!
|
||||
* The maximum number of writes can be can in a single batch that is being retried.
|
||||
*/
|
||||
exports.RETRY_MAX_BATCH_SIZE = 10;
|
||||
/*!
|
||||
* The starting maximum number of operations per second as allowed by the
|
||||
* 500/50/5 rule.
|
||||
*
|
||||
* https://firebase.google.com/docs/firestore/best-practices#ramping_up_traffic.
|
||||
*/
|
||||
exports.DEFAULT_INITIAL_OPS_PER_SECOND_LIMIT = 500;
|
||||
/*!
|
||||
* The maximum number of operations per second as allowed by the 500/50/5 rule.
|
||||
* By default the rate limiter will not exceed this value.
|
||||
*
|
||||
* https://firebase.google.com/docs/firestore/best-practices#ramping_up_traffic.
|
||||
*/
|
||||
exports.DEFAULT_MAXIMUM_OPS_PER_SECOND_LIMIT = 10000;
|
||||
/*!
|
||||
* The default jitter to apply to the exponential backoff used in retries. For
|
||||
* example, a factor of 0.3 means a 30% jitter is applied.
|
||||
*/
|
||||
exports.DEFAULT_JITTER_FACTOR = 0.3;
|
||||
/*!
|
||||
* The rate by which to increase the capacity as specified by the 500/50/5 rule.
|
||||
*/
|
||||
const RATE_LIMITER_MULTIPLIER = 1.5;
|
||||
/*!
|
||||
* How often the operations per second capacity should increase in milliseconds
|
||||
* as specified by the 500/50/5 rule.
|
||||
*/
|
||||
const RATE_LIMITER_MULTIPLIER_MILLIS = 5 * 60 * 1000;
|
||||
/*!
|
||||
* The default maximum number of pending operations that can be enqueued onto a
|
||||
* BulkWriter instance. An operation is considered pending if BulkWriter has
|
||||
* sent it via RPC and is awaiting the result. BulkWriter buffers additional
|
||||
* writes after this many pending operations in order to avoiding going OOM.
|
||||
*/
|
||||
const DEFAULT_MAXIMUM_PENDING_OPERATIONS_COUNT = 500;
|
||||
/**
|
||||
* Represents a single write for BulkWriter, encapsulating operation dispatch
|
||||
* and error handling.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class BulkWriterOperation {
|
||||
/**
|
||||
* @param ref The document reference being written to.
|
||||
* @param type The type of operation that created this write.
|
||||
* @param sendFn A callback to invoke when the operation should be sent.
|
||||
* @param errorFn The user provided global error callback.
|
||||
* @param successFn The user provided global success callback.
|
||||
*/
|
||||
constructor(ref, type, sendFn, errorFn, successFn) {
|
||||
this.ref = ref;
|
||||
this.type = type;
|
||||
this.sendFn = sendFn;
|
||||
this.errorFn = errorFn;
|
||||
this.successFn = successFn;
|
||||
this.deferred = new util_1.Deferred();
|
||||
this.failedAttempts = 0;
|
||||
this._backoffDuration = 0;
|
||||
/** Whether flush() was called when this was the last enqueued operation. */
|
||||
this._flushed = false;
|
||||
}
|
||||
get promise() {
|
||||
return this.deferred.promise;
|
||||
}
|
||||
get backoffDuration() {
|
||||
return this._backoffDuration;
|
||||
}
|
||||
markFlushed() {
|
||||
this._flushed = true;
|
||||
}
|
||||
get flushed() {
|
||||
return this._flushed;
|
||||
}
|
||||
onError(error) {
|
||||
++this.failedAttempts;
|
||||
try {
|
||||
const bulkWriterError = new BulkWriterError(error.code, error.message, this.ref, this.type, this.failedAttempts);
|
||||
const shouldRetry = this.errorFn(bulkWriterError);
|
||||
logger_1.logger('BulkWriter.errorFn', null, 'Ran error callback on error code:', error.code, ', shouldRetry:', shouldRetry, ' for document:', this.ref.path);
|
||||
if (shouldRetry) {
|
||||
this.lastStatus = error.code;
|
||||
this.updateBackoffDuration();
|
||||
this.sendFn(this);
|
||||
}
|
||||
else {
|
||||
this.deferred.reject(bulkWriterError);
|
||||
}
|
||||
}
|
||||
catch (userCallbackError) {
|
||||
this.deferred.reject(userCallbackError);
|
||||
}
|
||||
}
|
||||
updateBackoffDuration() {
|
||||
if (this.lastStatus === 8 /* RESOURCE_EXHAUSTED */) {
|
||||
this._backoffDuration = backoff_1.DEFAULT_BACKOFF_MAX_DELAY_MS;
|
||||
}
|
||||
else if (this._backoffDuration === 0) {
|
||||
this._backoffDuration = backoff_1.DEFAULT_BACKOFF_INITIAL_DELAY_MS;
|
||||
}
|
||||
else {
|
||||
this._backoffDuration *= backoff_1.DEFAULT_BACKOFF_FACTOR;
|
||||
}
|
||||
}
|
||||
onSuccess(result) {
|
||||
try {
|
||||
this.successFn(this.ref, result);
|
||||
this.deferred.resolve(result);
|
||||
}
|
||||
catch (userCallbackError) {
|
||||
this.deferred.reject(userCallbackError);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Used to represent a batch on the BatchQueue.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class BulkCommitBatch extends write_batch_1.WriteBatch {
|
||||
constructor(firestore, maxBatchSize) {
|
||||
super(firestore);
|
||||
// The set of document reference paths present in the WriteBatch.
|
||||
this.docPaths = new Set();
|
||||
// An array of pending write operations. Only contains writes that have not
|
||||
// been resolved.
|
||||
this.pendingOps = [];
|
||||
this._maxBatchSize = maxBatchSize;
|
||||
}
|
||||
get maxBatchSize() {
|
||||
return this._maxBatchSize;
|
||||
}
|
||||
setMaxBatchSize(size) {
|
||||
assert(this.pendingOps.length <= size, 'New batch size cannot be less than the number of enqueued writes');
|
||||
this._maxBatchSize = size;
|
||||
}
|
||||
has(documentRef) {
|
||||
return this.docPaths.has(documentRef.path);
|
||||
}
|
||||
async bulkCommit(options = {}) {
|
||||
var _a;
|
||||
const tag = (_a = options === null || options === void 0 ? void 0 : options.requestTag) !== null && _a !== void 0 ? _a : util_1.requestTag();
|
||||
// Capture the error stack to preserve stack tracing across async calls.
|
||||
const stack = Error().stack;
|
||||
let response;
|
||||
try {
|
||||
logger_1.logger('BulkCommitBatch.bulkCommit', tag, `Sending next batch with ${this._opCount} writes`);
|
||||
const retryCodes = util_1.getRetryCodes('batchWrite');
|
||||
response = await this._commit({ retryCodes, methodName: 'batchWrite', requestTag: tag });
|
||||
}
|
||||
catch (err) {
|
||||
// Map the failure to each individual write's result.
|
||||
const ops = Array.from({ length: this.pendingOps.length });
|
||||
response = {
|
||||
writeResults: ops.map(() => {
|
||||
return {};
|
||||
}),
|
||||
status: ops.map(() => err),
|
||||
};
|
||||
}
|
||||
for (let i = 0; i < (response.writeResults || []).length; ++i) {
|
||||
// Since delete operations currently do not have write times, use a
|
||||
// sentinel Timestamp value.
|
||||
// TODO(b/158502664): Use actual delete timestamp.
|
||||
const DELETE_TIMESTAMP_SENTINEL = timestamp_1.Timestamp.fromMillis(0);
|
||||
const status = (response.status || [])[i];
|
||||
if (status.code === 0 /* OK */) {
|
||||
const updateTime = timestamp_1.Timestamp.fromProto(response.writeResults[i].updateTime || DELETE_TIMESTAMP_SENTINEL);
|
||||
this.pendingOps[i].onSuccess(new write_batch_1.WriteResult(updateTime));
|
||||
}
|
||||
else {
|
||||
const error = new (require('google-gax').GoogleError)(status.message || undefined);
|
||||
error.code = status.code;
|
||||
this.pendingOps[i].onError(util_1.wrapError(error, stack));
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Helper to update data structures associated with the operation and returns
|
||||
* the result.
|
||||
*/
|
||||
processLastOperation(op) {
|
||||
assert(!this.docPaths.has(op.ref.path), 'Batch should not contain writes to the same document');
|
||||
this.docPaths.add(op.ref.path);
|
||||
this.pendingOps.push(op);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Used to represent a buffered BulkWriterOperation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class BufferedOperation {
|
||||
constructor(operation, sendFn) {
|
||||
this.operation = operation;
|
||||
this.sendFn = sendFn;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* The error thrown when a BulkWriter operation fails.
|
||||
*
|
||||
* @class BulkWriterError
|
||||
*/
|
||||
class BulkWriterError extends Error {
|
||||
/** @hideconstructor */
|
||||
constructor(
|
||||
/** The status code of the error. */
|
||||
code,
|
||||
/** The error message of the error. */
|
||||
message,
|
||||
/** The document reference the operation was performed on. */
|
||||
documentRef,
|
||||
/** The type of operation performed. */
|
||||
operationType,
|
||||
/** How many times this operation has been attempted unsuccessfully. */
|
||||
failedAttempts) {
|
||||
super(message);
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
this.documentRef = documentRef;
|
||||
this.operationType = operationType;
|
||||
this.failedAttempts = failedAttempts;
|
||||
}
|
||||
}
|
||||
exports.BulkWriterError = BulkWriterError;
|
||||
/**
|
||||
* A Firestore BulkWriter that can be used to perform a large number of writes
|
||||
* in parallel.
|
||||
*
|
||||
* @class BulkWriter
|
||||
*/
|
||||
class BulkWriter {
|
||||
/** @hideconstructor */
|
||||
constructor(firestore, options) {
|
||||
var _a, _b;
|
||||
this.firestore = firestore;
|
||||
/**
|
||||
* The maximum number of writes that can be in a single batch.
|
||||
* Visible for testing.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._maxBatchSize = MAX_BATCH_SIZE;
|
||||
/**
|
||||
* The batch that is currently used to schedule operations. Once this batch
|
||||
* reaches maximum capacity, a new batch is created.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._bulkCommitBatch = new BulkCommitBatch(this.firestore, this._maxBatchSize);
|
||||
/**
|
||||
* A pointer to the tail of all active BulkWriter operations. This pointer
|
||||
* is advanced every time a new write is enqueued.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._lastOp = Promise.resolve();
|
||||
/**
|
||||
* Whether this BulkWriter instance has started to close. Afterwards, no
|
||||
* new operations can be enqueued, except for retry operations scheduled by
|
||||
* the error handler.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._closing = false;
|
||||
/**
|
||||
* The number of pending operations enqueued on this BulkWriter instance.
|
||||
* An operation is considered pending if BulkWriter has sent it via RPC and
|
||||
* is awaiting the result.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._pendingOpsCount = 0;
|
||||
/**
|
||||
* An array containing buffered BulkWriter operations after the maximum number
|
||||
* of pending operations has been enqueued.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._bufferedOperations = [];
|
||||
/**
|
||||
* Whether a custom error handler has been set. BulkWriter only swallows
|
||||
* errors if an error handler is set. Otherwise, an UnhandledPromiseRejection
|
||||
* is thrown by Node if an operation promise is rejected without being
|
||||
* handled.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._errorHandlerSet = false;
|
||||
/**
|
||||
* The maximum number of pending operations that can be enqueued onto this
|
||||
* BulkWriter instance. Once the this number of writes have been enqueued,
|
||||
* subsequent writes are buffered.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._maxPendingOpCount = DEFAULT_MAXIMUM_PENDING_OPERATIONS_COUNT;
|
||||
/**
|
||||
* The user-provided callback to be run every time a BulkWriter operation
|
||||
* successfully completes.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._successFn = () => { };
|
||||
/**
|
||||
* The user-provided callback to be run every time a BulkWriter operation
|
||||
* fails.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this._errorFn = error => {
|
||||
const isRetryableDeleteError = error.operationType === 'delete' &&
|
||||
error.code === 13 /* INTERNAL */;
|
||||
const retryCodes = util_1.getRetryCodes('batchWrite');
|
||||
return ((retryCodes.includes(error.code) || isRetryableDeleteError) &&
|
||||
error.failedAttempts < backoff_1.MAX_RETRY_ATTEMPTS);
|
||||
};
|
||||
this.firestore._incrementBulkWritersCount();
|
||||
validateBulkWriterOptions(options);
|
||||
if ((options === null || options === void 0 ? void 0 : options.throttling) === false) {
|
||||
this._rateLimiter = new rate_limiter_1.RateLimiter(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);
|
||||
}
|
||||
else {
|
||||
let startingRate = exports.DEFAULT_INITIAL_OPS_PER_SECOND_LIMIT;
|
||||
let maxRate = exports.DEFAULT_MAXIMUM_OPS_PER_SECOND_LIMIT;
|
||||
if (typeof (options === null || options === void 0 ? void 0 : options.throttling) !== 'boolean') {
|
||||
if (((_a = options === null || options === void 0 ? void 0 : options.throttling) === null || _a === void 0 ? void 0 : _a.maxOpsPerSecond) !== undefined) {
|
||||
maxRate = options.throttling.maxOpsPerSecond;
|
||||
}
|
||||
if (((_b = options === null || options === void 0 ? void 0 : options.throttling) === null || _b === void 0 ? void 0 : _b.initialOpsPerSecond) !== undefined) {
|
||||
startingRate = options.throttling.initialOpsPerSecond;
|
||||
}
|
||||
// The initial validation step ensures that the maxOpsPerSecond is
|
||||
// greater than initialOpsPerSecond. If this inequality is true, that
|
||||
// means initialOpsPerSecond was not set and maxOpsPerSecond is less
|
||||
// than the default starting rate.
|
||||
if (maxRate < startingRate) {
|
||||
startingRate = maxRate;
|
||||
}
|
||||
// Ensure that the batch size is not larger than the number of allowed
|
||||
// operations per second.
|
||||
if (startingRate < this._maxBatchSize) {
|
||||
this._maxBatchSize = startingRate;
|
||||
}
|
||||
}
|
||||
this._rateLimiter = new rate_limiter_1.RateLimiter(startingRate, RATE_LIMITER_MULTIPLIER, RATE_LIMITER_MULTIPLIER_MILLIS, maxRate);
|
||||
}
|
||||
}
|
||||
// Visible for testing.
|
||||
_getBufferedOperationsCount() {
|
||||
return this._bufferedOperations.length;
|
||||
}
|
||||
// Visible for testing.
|
||||
_setMaxBatchSize(size) {
|
||||
assert(this._bulkCommitBatch.pendingOps.length === 0, 'BulkCommitBatch should be empty');
|
||||
this._maxBatchSize = size;
|
||||
this._bulkCommitBatch = new BulkCommitBatch(this.firestore, size);
|
||||
}
|
||||
// Visible for testing.
|
||||
_setMaxPendingOpCount(newMax) {
|
||||
this._maxPendingOpCount = newMax;
|
||||
}
|
||||
/**
|
||||
* Create a document with the provided data. This single operation will fail
|
||||
* if a document exists at its location.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* created.
|
||||
* @param {T} data The object to serialize as the document.
|
||||
* @returns {Promise<WriteResult>} A promise that resolves with the result of
|
||||
* the write. If the write fails, the promise is rejected with a
|
||||
* [BulkWriterError]{@link BulkWriterError}.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
* let documentRef = firestore.collection('col').doc();
|
||||
*
|
||||
* bulkWriter
|
||||
* .create(documentRef, {foo: 'bar'})
|
||||
* .then(result => {
|
||||
* console.log('Successfully executed write at: ', result);
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.log('Write failed with: ', err);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
create(documentRef, data) {
|
||||
this._verifyNotClosed();
|
||||
return this._enqueue(documentRef, 'create', bulkCommitBatch => bulkCommitBatch.create(documentRef, data));
|
||||
}
|
||||
/**
|
||||
* Delete a document from the database.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* deleted.
|
||||
* @param {Precondition=} precondition A precondition to enforce for this
|
||||
* delete.
|
||||
* @param {Timestamp=} precondition.lastUpdateTime If set, enforces that the
|
||||
* document was last updated at lastUpdateTime. Fails the batch if the
|
||||
* document doesn't exist or was last updated at a different time.
|
||||
* @returns {Promise<WriteResult>} A promise that resolves with the result of
|
||||
* the delete. If the delete fails, the promise is rejected with a
|
||||
* [BulkWriterError]{@link BulkWriterError}.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* bulkWriter
|
||||
* .delete(documentRef)
|
||||
* .then(result => {
|
||||
* console.log('Successfully deleted document');
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.log('Delete failed with: ', err);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
delete(documentRef, precondition) {
|
||||
this._verifyNotClosed();
|
||||
return this._enqueue(documentRef, 'delete', bulkCommitBatch => bulkCommitBatch.delete(documentRef, precondition));
|
||||
}
|
||||
/**
|
||||
* Write to the document referred to by the provided
|
||||
* [DocumentReference]{@link DocumentReference}. If the document does not
|
||||
* exist yet, it will be created. If you pass [SetOptions]{@link SetOptions}.,
|
||||
* the provided data can be merged into the existing document.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* set.
|
||||
* @param {T} data The object to serialize as the document.
|
||||
* @param {SetOptions=} options An object to configure the set behavior.
|
||||
* @param {boolean=} options.merge - If true, set() merges the values
|
||||
* specified in its data argument. Fields omitted from this set() call remain
|
||||
* untouched.
|
||||
* @param {Array.<string|FieldPath>=} options.mergeFields - If provided, set()
|
||||
* only replaces the specified field paths. Any field path that is not
|
||||
* specified is ignored and remains untouched.
|
||||
* @returns {Promise<WriteResult>} A promise that resolves with the result of
|
||||
* the write. If the write fails, the promise is rejected with a
|
||||
* [BulkWriterError]{@link BulkWriterError}.
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
* let documentRef = firestore.collection('col').doc();
|
||||
*
|
||||
* bulkWriter
|
||||
* .set(documentRef, {foo: 'bar'})
|
||||
* .then(result => {
|
||||
* console.log('Successfully executed write at: ', result);
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.log('Write failed with: ', err);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
set(documentRef, data, options) {
|
||||
this._verifyNotClosed();
|
||||
return this._enqueue(documentRef, 'set', bulkCommitBatch => bulkCommitBatch.set(documentRef, data, options));
|
||||
}
|
||||
/**
|
||||
* Update fields of the document referred to by the provided
|
||||
* [DocumentReference]{@link DocumentReference}. If the document doesn't yet
|
||||
* exist, the update fails and the entire batch will be rejected.
|
||||
*
|
||||
* The update() method accepts either an object with field paths encoded as
|
||||
* keys and field values encoded as values, or a variable number of arguments
|
||||
* that alternate between field paths and field values. Nested fields can be
|
||||
* updated by providing dot-separated field path strings or by providing
|
||||
* FieldPath objects.
|
||||
*
|
||||
*
|
||||
* A Precondition restricting this update can be specified as the last
|
||||
* argument.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* updated.
|
||||
* @param {UpdateData|string|FieldPath} dataOrField An object containing the
|
||||
* fields and values with which to update the document or the path of the
|
||||
* first field to update.
|
||||
* @param {...(Precondition|*|string|FieldPath)} preconditionOrValues - An
|
||||
* alternating list of field paths and values to update or a Precondition to
|
||||
* restrict this update
|
||||
* @returns {Promise<WriteResult>} A promise that resolves with the result of
|
||||
* the write. If the write fails, the promise is rejected with a
|
||||
* [BulkWriterError]{@link BulkWriterError}.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* bulkWriter
|
||||
* .update(documentRef, {foo: 'bar'})
|
||||
* .then(result => {
|
||||
* console.log('Successfully executed write at: ', result);
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.log('Write failed with: ', err);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
update(documentRef, dataOrField, ...preconditionOrValues) {
|
||||
this._verifyNotClosed();
|
||||
return this._enqueue(documentRef, 'update', bulkCommitBatch => bulkCommitBatch.update(documentRef, dataOrField, ...preconditionOrValues));
|
||||
}
|
||||
/**
|
||||
* Callback function set by {@link BulkWriter#onWriteResult} that is run
|
||||
* every time a {@link BulkWriter} operation successfully completes.
|
||||
*
|
||||
* @callback BulkWriter~successCallback
|
||||
* @param {DocumentReference} documentRef The document reference the
|
||||
* operation was performed on
|
||||
* @param {WriteResult} result The server write time of the operation.
|
||||
*/
|
||||
/**
|
||||
* Attaches a listener that is run every time a BulkWriter operation
|
||||
* successfully completes.
|
||||
*
|
||||
* @param {BulkWriter~successCallback} successCallback A callback to be
|
||||
* called every time a BulkWriter operation successfully completes.
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter
|
||||
* .onWriteResult((documentRef, result) => {
|
||||
* console.log(
|
||||
* 'Successfully executed write on document: ',
|
||||
* documentRef,
|
||||
* ' at: ',
|
||||
* result
|
||||
* );
|
||||
* });
|
||||
*/
|
||||
onWriteResult(successCallback) {
|
||||
this._successFn = successCallback;
|
||||
}
|
||||
/**
|
||||
* Callback function set by {@link BulkWriter#onWriteError} that is run when
|
||||
* a write fails in order to determine whether {@link BulkWriter} should
|
||||
* retry the operation.
|
||||
*
|
||||
* @callback BulkWriter~shouldRetryCallback
|
||||
* @param {BulkWriterError} error The error object with information about the
|
||||
* operation and error.
|
||||
* @returns {boolean} Whether or not to retry the failed operation. Returning
|
||||
* `true` retries the operation. Returning `false` will stop the retry loop.
|
||||
*/
|
||||
/**
|
||||
* Attaches an error handler listener that is run every time a BulkWriter
|
||||
* operation fails.
|
||||
*
|
||||
* BulkWriter has a default error handler that retries UNAVAILABLE and
|
||||
* ABORTED errors up to a maximum of 10 failed attempts. When an error
|
||||
* handler is specified, the default error handler will be overwritten.
|
||||
*
|
||||
* @param shouldRetryCallback {BulkWriter~shouldRetryCallback} A callback to
|
||||
* be called every time a BulkWriter operation fails. Returning `true` will
|
||||
* retry the operation. Returning `false` will stop the retry loop.
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter
|
||||
* .onWriteError((error) => {
|
||||
* if (
|
||||
* error.code === GrpcStatus.UNAVAILABLE &&
|
||||
* error.failedAttempts < MAX_RETRY_ATTEMPTS
|
||||
* ) {
|
||||
* return true;
|
||||
* } else {
|
||||
* console.log('Failed write at document: ', error.documentRef);
|
||||
* return false;
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
onWriteError(shouldRetryCallback) {
|
||||
this._errorHandlerSet = true;
|
||||
this._errorFn = shouldRetryCallback;
|
||||
}
|
||||
/**
|
||||
* Commits all writes that have been enqueued up to this point in parallel.
|
||||
*
|
||||
* Returns a Promise that resolves when all currently queued operations have
|
||||
* been committed. The Promise will never be rejected since the results for
|
||||
* each individual operation are conveyed via their individual Promises.
|
||||
*
|
||||
* The Promise resolves immediately if there are no pending writes. Otherwise,
|
||||
* the Promise waits for all previously issued writes, but it does not wait
|
||||
* for writes that were added after the method is called. If you want to wait
|
||||
* for additional writes, call `flush()` again.
|
||||
*
|
||||
* @return {Promise<void>} A promise that resolves when all enqueued writes
|
||||
* up to this point have been committed.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter.create(documentRef, {foo: 'bar'});
|
||||
* bulkWriter.update(documentRef2, {foo: 'bar'});
|
||||
* bulkWriter.delete(documentRef3);
|
||||
* await flush().then(() => {
|
||||
* console.log('Executed all writes');
|
||||
* });
|
||||
*/
|
||||
flush() {
|
||||
this._verifyNotClosed();
|
||||
this._scheduleCurrentBatch(/* flush= */ true);
|
||||
// Mark the most recent operation as flushed to ensure that the batch
|
||||
// containing it will be sent once it's popped from the buffer.
|
||||
if (this._bufferedOperations.length > 0) {
|
||||
this._bufferedOperations[this._bufferedOperations.length - 1].operation.markFlushed();
|
||||
}
|
||||
return this._lastOp;
|
||||
}
|
||||
/**
|
||||
* Commits all enqueued writes and marks the BulkWriter instance as closed.
|
||||
*
|
||||
* After calling `close()`, calling any method will throw an error. Any
|
||||
* retries scheduled as part of an `onWriteError()` handler will be run
|
||||
* before the `close()` promise resolves.
|
||||
*
|
||||
* Returns a Promise that resolves when there are no more pending writes. The
|
||||
* Promise will never be rejected. Calling this method will send all requests.
|
||||
* The promise resolves immediately if there are no pending writes.
|
||||
*
|
||||
* @return {Promise<void>} A promise that resolves when all enqueued writes
|
||||
* up to this point have been committed.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter.create(documentRef, {foo: 'bar'});
|
||||
* bulkWriter.update(documentRef2, {foo: 'bar'});
|
||||
* bulkWriter.delete(documentRef3);
|
||||
* await close().then(() => {
|
||||
* console.log('Executed all writes');
|
||||
* });
|
||||
*/
|
||||
close() {
|
||||
this._verifyNotClosed();
|
||||
this.firestore._decrementBulkWritersCount();
|
||||
const flushPromise = this.flush();
|
||||
this._closing = true;
|
||||
return flushPromise;
|
||||
}
|
||||
/**
|
||||
* Throws an error if the BulkWriter instance has been closed.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_verifyNotClosed() {
|
||||
if (this._closing) {
|
||||
throw new Error('BulkWriter has already been closed.');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Sends the current batch and resets `this._bulkCommitBatch`.
|
||||
*
|
||||
* @param flush If provided, keeps re-sending operations until no more
|
||||
* operations are enqueued. This allows retries to resolve as part of a
|
||||
* `flush()` or `close()` call.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_scheduleCurrentBatch(flush = false) {
|
||||
if (this._bulkCommitBatch._opCount === 0)
|
||||
return;
|
||||
const pendingBatch = this._bulkCommitBatch;
|
||||
this._bulkCommitBatch = new BulkCommitBatch(this.firestore, this._maxBatchSize);
|
||||
// Use the write with the longest backoff duration when determining backoff.
|
||||
const highestBackoffDuration = pendingBatch.pendingOps.reduce((prev, cur) => prev.backoffDuration > cur.backoffDuration ? prev : cur).backoffDuration;
|
||||
const backoffMsWithJitter = BulkWriter._applyJitter(highestBackoffDuration);
|
||||
const delayedExecution = new util_1.Deferred();
|
||||
if (backoffMsWithJitter > 0) {
|
||||
backoff_1.delayExecution(() => delayedExecution.resolve(), backoffMsWithJitter);
|
||||
}
|
||||
else {
|
||||
delayedExecution.resolve();
|
||||
}
|
||||
delayedExecution.promise.then(() => this._sendBatch(pendingBatch, flush));
|
||||
}
|
||||
/**
|
||||
* Sends the provided batch once the rate limiter does not require any delay.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
async _sendBatch(batch, flush = false) {
|
||||
const tag = util_1.requestTag();
|
||||
// Send the batch if it is does not require any delay, or schedule another
|
||||
// attempt after the appropriate timeout.
|
||||
const underRateLimit = this._rateLimiter.tryMakeRequest(batch._opCount);
|
||||
if (underRateLimit) {
|
||||
await batch.bulkCommit({ requestTag: tag });
|
||||
if (flush)
|
||||
this._scheduleCurrentBatch(flush);
|
||||
}
|
||||
else {
|
||||
const delayMs = this._rateLimiter.getNextRequestDelayMs(batch._opCount);
|
||||
logger_1.logger('BulkWriter._sendBatch', tag, `Backing off for ${delayMs} seconds`);
|
||||
backoff_1.delayExecution(() => this._sendBatch(batch, flush), delayMs);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Adds a 30% jitter to the provided backoff.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
static _applyJitter(backoffMs) {
|
||||
if (backoffMs === 0)
|
||||
return 0;
|
||||
// Random value in [-0.3, 0.3].
|
||||
const jitter = exports.DEFAULT_JITTER_FACTOR * (Math.random() * 2 - 1);
|
||||
return Math.min(backoff_1.DEFAULT_BACKOFF_MAX_DELAY_MS, backoffMs + jitter * backoffMs);
|
||||
}
|
||||
/**
|
||||
* Schedules and runs the provided operation on the next available batch.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_enqueue(ref, type, enqueueOnBatchCallback) {
|
||||
const bulkWriterOp = new BulkWriterOperation(ref, type, this._sendFn.bind(this, enqueueOnBatchCallback), this._errorFn.bind(this), this._successFn.bind(this));
|
||||
// Swallow the error if the developer has set an error listener. This
|
||||
// prevents UnhandledPromiseRejections from being thrown if a floating
|
||||
// BulkWriter operation promise fails when an error handler is specified.
|
||||
//
|
||||
// This is done here in order to chain the caught promise onto `lastOp`,
|
||||
// which ensures that flush() resolves after the operation promise.
|
||||
const userPromise = bulkWriterOp.promise.catch(err => {
|
||||
if (!this._errorHandlerSet) {
|
||||
throw err;
|
||||
}
|
||||
else {
|
||||
return bulkWriterOp.promise;
|
||||
}
|
||||
});
|
||||
// Advance the `_lastOp` pointer. This ensures that `_lastOp` only resolves
|
||||
// when both the previous and the current write resolve.
|
||||
this._lastOp = this._lastOp.then(() => util_1.silencePromise(userPromise));
|
||||
// Schedule the operation if the BulkWriter has fewer than the maximum
|
||||
// number of allowed pending operations, or add the operation to the
|
||||
// buffer.
|
||||
if (this._pendingOpsCount < this._maxPendingOpCount) {
|
||||
this._pendingOpsCount++;
|
||||
this._sendFn(enqueueOnBatchCallback, bulkWriterOp);
|
||||
}
|
||||
else {
|
||||
this._bufferedOperations.push(new BufferedOperation(bulkWriterOp, () => {
|
||||
this._pendingOpsCount++;
|
||||
this._sendFn(enqueueOnBatchCallback, bulkWriterOp);
|
||||
}));
|
||||
}
|
||||
// Chain the BulkWriter operation promise with the buffer processing logic
|
||||
// in order to ensure that it runs and that subsequent operations are
|
||||
// enqueued before the next batch is scheduled in `_sendBatch()`.
|
||||
return userPromise
|
||||
.then(res => {
|
||||
this._pendingOpsCount--;
|
||||
this._processBufferedOps();
|
||||
return res;
|
||||
})
|
||||
.catch(err => {
|
||||
this._pendingOpsCount--;
|
||||
this._processBufferedOps();
|
||||
throw err;
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Manages the pending operation counter and schedules the next BulkWriter
|
||||
* operation if we're under the maximum limit.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_processBufferedOps() {
|
||||
if (this._pendingOpsCount < this._maxPendingOpCount &&
|
||||
this._bufferedOperations.length > 0) {
|
||||
const nextOp = this._bufferedOperations.shift();
|
||||
nextOp.sendFn();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Schedules the provided operations on current BulkCommitBatch.
|
||||
* Sends the BulkCommitBatch if it reaches maximum capacity.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_sendFn(enqueueOnBatchCallback, op) {
|
||||
// A backoff duration greater than 0 implies that this batch is a retry.
|
||||
// Retried writes are sent with a batch size of 10 in order to guarantee
|
||||
// that the batch is under the 10MiB limit.
|
||||
if (op.backoffDuration > 0) {
|
||||
if (this._bulkCommitBatch.pendingOps.length >= exports.RETRY_MAX_BATCH_SIZE) {
|
||||
this._scheduleCurrentBatch(/* flush= */ false);
|
||||
}
|
||||
this._bulkCommitBatch.setMaxBatchSize(exports.RETRY_MAX_BATCH_SIZE);
|
||||
}
|
||||
if (this._bulkCommitBatch.has(op.ref)) {
|
||||
// Create a new batch since the backend doesn't support batches with two
|
||||
// writes to the same document.
|
||||
this._scheduleCurrentBatch();
|
||||
}
|
||||
enqueueOnBatchCallback(this._bulkCommitBatch);
|
||||
this._bulkCommitBatch.processLastOperation(op);
|
||||
if (this._bulkCommitBatch._opCount === this._bulkCommitBatch.maxBatchSize) {
|
||||
this._scheduleCurrentBatch();
|
||||
}
|
||||
else if (op.flushed) {
|
||||
// If flush() was called before this operation was enqueued into a batch,
|
||||
// we still need to schedule it.
|
||||
this._scheduleCurrentBatch(/* flush= */ true);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.BulkWriter = BulkWriter;
|
||||
/**
|
||||
* Validates the use of 'value' as BulkWriterOptions.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param value The BulkWriterOptions object to validate.
|
||||
* @throws if the input is not a valid BulkWriterOptions object.
|
||||
*/
|
||||
function validateBulkWriterOptions(value) {
|
||||
if (validate_1.validateOptional(value, { optional: true })) {
|
||||
return;
|
||||
}
|
||||
const argName = 'options';
|
||||
if (!util_1.isObject(value)) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(argName, 'bulkWriter() options argument')} Input is not an object.`);
|
||||
}
|
||||
const options = value;
|
||||
if (options.throttling === undefined ||
|
||||
typeof options.throttling === 'boolean') {
|
||||
return;
|
||||
}
|
||||
if (options.throttling.initialOpsPerSecond !== undefined) {
|
||||
validate_1.validateInteger('initialOpsPerSecond', options.throttling.initialOpsPerSecond, {
|
||||
minValue: 1,
|
||||
});
|
||||
}
|
||||
if (options.throttling.maxOpsPerSecond !== undefined) {
|
||||
validate_1.validateInteger('maxOpsPerSecond', options.throttling.maxOpsPerSecond, {
|
||||
minValue: 1,
|
||||
});
|
||||
if (options.throttling.initialOpsPerSecond !== undefined &&
|
||||
options.throttling.initialOpsPerSecond >
|
||||
options.throttling.maxOpsPerSecond) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(argName, 'bulkWriter() options argument')} "maxOpsPerSecond" cannot be less than "initialOpsPerSecond".`);
|
||||
}
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=bulk-writer.js.map
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
/// <reference types="node" />
|
||||
import { DocumentSnapshot } from './document';
|
||||
import { QuerySnapshot } from './reference';
|
||||
/**
|
||||
* Builds a Firestore data bundle with results from the given document and query snapshots.
|
||||
*/
|
||||
export declare class BundleBuilder {
|
||||
readonly bundleId: string;
|
||||
private documents;
|
||||
private namedQueries;
|
||||
private latestReadTime;
|
||||
constructor(bundleId: string);
|
||||
add(documentSnapshot: DocumentSnapshot): BundleBuilder;
|
||||
add(queryName: string, querySnapshot: QuerySnapshot): BundleBuilder;
|
||||
private addBundledDocument;
|
||||
private addNamedQuery;
|
||||
/**
|
||||
* Converts a IBundleElement to a Buffer whose content is the length prefixed JSON representation
|
||||
* of the element.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private elementToLengthPrefixedBuffer;
|
||||
build(): Buffer;
|
||||
}
|
||||
+204
@@ -0,0 +1,204 @@
|
||||
"use strict";
|
||||
// Copyright 2020 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.
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const document_1 = require("./document");
|
||||
const reference_1 = require("./reference");
|
||||
const timestamp_1 = require("./timestamp");
|
||||
const validate_1 = require("./validate");
|
||||
const BUNDLE_VERSION = 1;
|
||||
/**
|
||||
* Builds a Firestore data bundle with results from the given document and query snapshots.
|
||||
*/
|
||||
class BundleBuilder {
|
||||
constructor(bundleId) {
|
||||
this.bundleId = bundleId;
|
||||
// Resulting documents for the bundle, keyed by full document path.
|
||||
this.documents = new Map();
|
||||
// Named queries saved in the bundle, keyed by query name.
|
||||
this.namedQueries = new Map();
|
||||
// The latest read time among all bundled documents and queries.
|
||||
this.latestReadTime = new timestamp_1.Timestamp(0, 0);
|
||||
}
|
||||
/**
|
||||
* Adds a Firestore document snapshot or query snapshot to the bundle.
|
||||
* Both the documents data and the query read time will be included in the bundle.
|
||||
*
|
||||
* @param {DocumentSnapshot | string} documentOrName A document snapshot to add or a name of a query.
|
||||
* @param {Query=} querySnapshot A query snapshot to add to the bundle, if provided.
|
||||
* @returns {BundleBuilder} This instance.
|
||||
*
|
||||
* @example
|
||||
* const bundle = firestore.bundle('data-bundle');
|
||||
* const docSnapshot = await firestore.doc('abc/123').get();
|
||||
* const querySnapshot = await firestore.collection('coll').get();
|
||||
*
|
||||
* const bundleBuffer = bundle.add(docSnapshot); // Add a document
|
||||
* .add('coll-query', querySnapshot) // Add a named query.
|
||||
* .build()
|
||||
* // Save `bundleBuffer` to CDN or stream it to clients.
|
||||
*/
|
||||
add(documentOrName, querySnapshot) {
|
||||
// eslint-disable-next-line prefer-rest-params
|
||||
validate_1.validateMinNumberOfArguments('BundleBuilder.add', arguments, 1);
|
||||
// eslint-disable-next-line prefer-rest-params
|
||||
validate_1.validateMaxNumberOfArguments('BundleBuilder.add', arguments, 2);
|
||||
if (arguments.length === 1) {
|
||||
validateDocumentSnapshot('documentOrName', documentOrName);
|
||||
this.addBundledDocument(documentOrName);
|
||||
}
|
||||
else {
|
||||
validate_1.validateString('documentOrName', documentOrName);
|
||||
validateQuerySnapshot('querySnapshot', querySnapshot);
|
||||
this.addNamedQuery(documentOrName, querySnapshot);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
addBundledDocument(snap, queryName) {
|
||||
const originalDocument = this.documents.get(snap.ref.path);
|
||||
const originalQueries = originalDocument === null || originalDocument === void 0 ? void 0 : originalDocument.metadata.queries;
|
||||
// Update with document built from `snap` because it is newer.
|
||||
if (!originalDocument ||
|
||||
timestamp_1.Timestamp.fromProto(originalDocument.metadata.readTime) < snap.readTime) {
|
||||
const docProto = snap.toDocumentProto();
|
||||
this.documents.set(snap.ref.path, {
|
||||
document: snap.exists ? docProto : undefined,
|
||||
metadata: {
|
||||
name: docProto.name,
|
||||
readTime: snap.readTime.toProto().timestampValue,
|
||||
exists: snap.exists,
|
||||
},
|
||||
});
|
||||
}
|
||||
// Update `queries` to include both original and `queryName`.
|
||||
const newDocument = this.documents.get(snap.ref.path);
|
||||
newDocument.metadata.queries = originalQueries || [];
|
||||
if (queryName) {
|
||||
newDocument.metadata.queries.push(queryName);
|
||||
}
|
||||
if (snap.readTime > this.latestReadTime) {
|
||||
this.latestReadTime = snap.readTime;
|
||||
}
|
||||
}
|
||||
addNamedQuery(name, querySnap) {
|
||||
if (this.namedQueries.has(name)) {
|
||||
throw new Error(`Query name conflict: ${name} has already been added.`);
|
||||
}
|
||||
this.namedQueries.set(name, {
|
||||
name,
|
||||
bundledQuery: querySnap.query._toBundledQuery(),
|
||||
readTime: querySnap.readTime.toProto().timestampValue,
|
||||
});
|
||||
for (const snap of querySnap.docs) {
|
||||
this.addBundledDocument(snap, name);
|
||||
}
|
||||
if (querySnap.readTime > this.latestReadTime) {
|
||||
this.latestReadTime = querySnap.readTime;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Converts a IBundleElement to a Buffer whose content is the length prefixed JSON representation
|
||||
* of the element.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
elementToLengthPrefixedBuffer(bundleElement) {
|
||||
// Convert to a valid proto message object then take its JSON representation.
|
||||
// This take cares of stuff like converting internal byte array fields
|
||||
// to Base64 encodings.
|
||||
// We lazy-load the Proto file to reduce cold-start times.
|
||||
const message = require('../protos/firestore_v1_proto_api')
|
||||
.firestore.BundleElement.fromObject(bundleElement)
|
||||
.toJSON();
|
||||
const buffer = Buffer.from(JSON.stringify(message), 'utf-8');
|
||||
const lengthBuffer = Buffer.from(buffer.length.toString());
|
||||
return Buffer.concat([lengthBuffer, buffer]);
|
||||
}
|
||||
build() {
|
||||
let bundleBuffer = Buffer.alloc(0);
|
||||
for (const namedQuery of this.namedQueries.values()) {
|
||||
bundleBuffer = Buffer.concat([
|
||||
bundleBuffer,
|
||||
this.elementToLengthPrefixedBuffer({ namedQuery }),
|
||||
]);
|
||||
}
|
||||
for (const bundledDocument of this.documents.values()) {
|
||||
const documentMetadata = bundledDocument.metadata;
|
||||
bundleBuffer = Buffer.concat([
|
||||
bundleBuffer,
|
||||
this.elementToLengthPrefixedBuffer({ documentMetadata }),
|
||||
]);
|
||||
// Write to the bundle if document exists.
|
||||
const document = bundledDocument.document;
|
||||
if (document) {
|
||||
bundleBuffer = Buffer.concat([
|
||||
bundleBuffer,
|
||||
this.elementToLengthPrefixedBuffer({ document }),
|
||||
]);
|
||||
}
|
||||
}
|
||||
const metadata = {
|
||||
id: this.bundleId,
|
||||
createTime: this.latestReadTime.toProto().timestampValue,
|
||||
version: BUNDLE_VERSION,
|
||||
totalDocuments: this.documents.size,
|
||||
totalBytes: bundleBuffer.length,
|
||||
};
|
||||
// Prepends the metadata element to the bundleBuffer: `bundleBuffer` is the second argument to `Buffer.concat`.
|
||||
bundleBuffer = Buffer.concat([
|
||||
this.elementToLengthPrefixedBuffer({ metadata }),
|
||||
bundleBuffer,
|
||||
]);
|
||||
return bundleBuffer;
|
||||
}
|
||||
}
|
||||
exports.BundleBuilder = BundleBuilder;
|
||||
/**
|
||||
* Convenient class to hold both the metadata and the actual content of a document to be bundled.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class BundledDocument {
|
||||
constructor(metadata, document) {
|
||||
this.metadata = metadata;
|
||||
this.document = document;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Validates that 'value' is DocumentSnapshot.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param value The input to validate.
|
||||
*/
|
||||
function validateDocumentSnapshot(arg, value) {
|
||||
if (!(value instanceof document_1.DocumentSnapshot)) {
|
||||
throw new Error(validate_1.invalidArgumentMessage(arg, 'DocumentSnapshot'));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Validates that 'value' is QuerySnapshot.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param value The input to validate.
|
||||
*/
|
||||
function validateQuerySnapshot(arg, value) {
|
||||
if (!(value instanceof reference_1.QuerySnapshot)) {
|
||||
throw new Error(validate_1.invalidArgumentMessage(arg, 'QuerySnapshot'));
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=bundle.js.map
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { QueryPartition } from './query-partition';
|
||||
import { Query } from './reference';
|
||||
import { Firestore } from './index';
|
||||
/**
|
||||
* A `CollectionGroup` refers to all documents that are contained in a
|
||||
* collection or subcollection with a specific collection ID.
|
||||
*
|
||||
* @class CollectionGroup
|
||||
*/
|
||||
export declare class CollectionGroup<T = firestore.DocumentData> extends Query<T> implements firestore.CollectionGroup<T> {
|
||||
/** @hideconstructor */
|
||||
constructor(firestore: Firestore, collectionId: string, converter: firestore.FirestoreDataConverter<T> | undefined);
|
||||
/**
|
||||
* Partitions a query by returning partition cursors that can be used to run
|
||||
* the query in parallel. The returned cursors are split points that can be
|
||||
* used as starting and end points for individual query invocations.
|
||||
*
|
||||
* @example
|
||||
* const query = firestore.collectionGroup('collectionId');
|
||||
* for await (const partition of query.getPartitions(42)) {
|
||||
* const partitionedQuery = partition.toQuery();
|
||||
* const querySnapshot = await partitionedQuery.get();
|
||||
* console.log(`Partition contained ${querySnapshot.length} documents`);
|
||||
* }
|
||||
*
|
||||
* @param {number} desiredPartitionCount The desired maximum number of
|
||||
* partition points. The number must be strictly positive. The actual number
|
||||
* of partitions returned may be fewer.
|
||||
* @return {AsyncIterable<QueryPartition>} An AsyncIterable of
|
||||
* `QueryPartition`s.
|
||||
*/
|
||||
getPartitions(desiredPartitionCount: number): AsyncIterable<QueryPartition<T>>;
|
||||
/**
|
||||
* Applies a custom data converter to this `CollectionGroup`, allowing you
|
||||
* to use your own custom model objects with Firestore. When you call get()
|
||||
* on the returned `CollectionGroup`, the provided converter will convert
|
||||
* between Firestore data and your custom type U.
|
||||
*
|
||||
* Using the converter allows you to specify generic type arguments when
|
||||
* storing and retrieving objects from Firestore.
|
||||
*
|
||||
* Passing in `null` as the converter parameter removes the current
|
||||
* converter.
|
||||
*
|
||||
* @example
|
||||
* class Post {
|
||||
* constructor(readonly title: string, readonly author: string) {}
|
||||
*
|
||||
* toString(): string {
|
||||
* return this.title + ', by ' + this.author;
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* const postConverter = {
|
||||
* toFirestore(post: Post): FirebaseFirestore.DocumentData {
|
||||
* return {title: post.title, author: post.author};
|
||||
* },
|
||||
* fromFirestore(
|
||||
* snapshot: FirebaseFirestore.QueryDocumentSnapshot
|
||||
* ): Post {
|
||||
* const data = snapshot.data();
|
||||
* return new Post(data.title, data.author);
|
||||
* }
|
||||
* };
|
||||
*
|
||||
* const querySnapshot = await Firestore()
|
||||
* .collectionGroup('posts')
|
||||
* .withConverter(postConverter)
|
||||
* .get();
|
||||
* for (const doc of querySnapshot.docs) {
|
||||
* const post = doc.data();
|
||||
* post.title; // string
|
||||
* post.toString(); // Should be defined
|
||||
* post.someNonExistentProperty; // TS error
|
||||
* }
|
||||
*
|
||||
* @param {FirestoreDataConverter | null} converter Converts objects to and
|
||||
* from Firestore. Passing in `null` removes the current converter.
|
||||
* @return {CollectionGroup} A `CollectionGroup<U>` that uses the provided
|
||||
* converter.
|
||||
*/
|
||||
withConverter(converter: null): CollectionGroup<firestore.DocumentData>;
|
||||
withConverter<U>(converter: firestore.FirestoreDataConverter<U>): CollectionGroup<U>;
|
||||
}
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
"use strict";
|
||||
/*
|
||||
* Copyright 2020 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const query_partition_1 = require("./query-partition");
|
||||
const util_1 = require("./util");
|
||||
const logger_1 = require("./logger");
|
||||
const reference_1 = require("./reference");
|
||||
const path_1 = require("./path");
|
||||
const validate_1 = require("./validate");
|
||||
const types_1 = require("./types");
|
||||
const order_1 = require("./order");
|
||||
/**
|
||||
* A `CollectionGroup` refers to all documents that are contained in a
|
||||
* collection or subcollection with a specific collection ID.
|
||||
*
|
||||
* @class CollectionGroup
|
||||
*/
|
||||
class CollectionGroup extends reference_1.Query {
|
||||
/** @hideconstructor */
|
||||
constructor(firestore, collectionId, converter) {
|
||||
super(firestore, reference_1.QueryOptions.forCollectionGroupQuery(collectionId, converter));
|
||||
}
|
||||
/**
|
||||
* Partitions a query by returning partition cursors that can be used to run
|
||||
* the query in parallel. The returned cursors are split points that can be
|
||||
* used as starting and end points for individual query invocations.
|
||||
*
|
||||
* @example
|
||||
* const query = firestore.collectionGroup('collectionId');
|
||||
* for await (const partition of query.getPartitions(42)) {
|
||||
* const partitionedQuery = partition.toQuery();
|
||||
* const querySnapshot = await partitionedQuery.get();
|
||||
* console.log(`Partition contained ${querySnapshot.length} documents`);
|
||||
* }
|
||||
*
|
||||
* @param {number} desiredPartitionCount The desired maximum number of
|
||||
* partition points. The number must be strictly positive. The actual number
|
||||
* of partitions returned may be fewer.
|
||||
* @return {AsyncIterable<QueryPartition>} An AsyncIterable of
|
||||
* `QueryPartition`s.
|
||||
*/
|
||||
async *getPartitions(desiredPartitionCount) {
|
||||
var _a;
|
||||
validate_1.validateInteger('desiredPartitionCount', desiredPartitionCount, {
|
||||
minValue: 1,
|
||||
});
|
||||
const tag = util_1.requestTag();
|
||||
await this.firestore.initializeIfNeeded(tag);
|
||||
const partitions = [];
|
||||
if (desiredPartitionCount > 1) {
|
||||
// Partition queries require explicit ordering by __name__.
|
||||
const queryWithDefaultOrder = this.orderBy(path_1.FieldPath.documentId());
|
||||
const request = queryWithDefaultOrder.toProto();
|
||||
// Since we are always returning an extra partition (with an empty endBefore
|
||||
// cursor), we reduce the desired partition count by one.
|
||||
request.partitionCount = desiredPartitionCount - 1;
|
||||
const stream = await this.firestore.requestStream('partitionQueryStream', request, tag);
|
||||
stream.resume();
|
||||
for await (const currentCursor of stream) {
|
||||
partitions.push((_a = currentCursor.values) !== null && _a !== void 0 ? _a : []);
|
||||
}
|
||||
}
|
||||
logger_1.logger('Firestore.getPartitions', tag, 'Received %d partitions', partitions.length);
|
||||
// Sort the partitions as they may not be ordered if responses are paged.
|
||||
partitions.sort((l, r) => order_1.compareArrays(l, r));
|
||||
for (let i = 0; i < partitions.length; ++i) {
|
||||
yield new query_partition_1.QueryPartition(this._firestore, this._queryOptions.collectionId, this._queryOptions.converter, i > 0 ? partitions[i - 1] : undefined, partitions[i]);
|
||||
}
|
||||
// Return the extra partition with the empty cursor.
|
||||
yield new query_partition_1.QueryPartition(this._firestore, this._queryOptions.collectionId, this._queryOptions.converter, partitions.pop(), undefined);
|
||||
}
|
||||
withConverter(converter) {
|
||||
return new CollectionGroup(this.firestore, this._queryOptions.collectionId, converter !== null && converter !== void 0 ? converter : types_1.defaultConverter());
|
||||
}
|
||||
}
|
||||
exports.CollectionGroup = CollectionGroup;
|
||||
//# sourceMappingURL=collection-group.js.map
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
/*!
|
||||
* Copyright 2019 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { google } from '../protos/firestore_v1_proto_api';
|
||||
import { ApiMapValue, ProtobufJsValue } from './types';
|
||||
import api = google.firestore.v1;
|
||||
/*!
|
||||
* @module firestore/convert
|
||||
* @private
|
||||
* @internal
|
||||
*
|
||||
* This module contains utility functions to convert
|
||||
* `firestore.v1.Documents` from Proto3 JSON to their equivalent
|
||||
* representation in Protobuf JS. Protobuf JS is the only encoding supported by
|
||||
* this client, and dependencies that use Proto3 JSON (such as the Google Cloud
|
||||
* Functions SDK) are supported through this conversion and its usage in
|
||||
* {@see Firestore#snapshot_}.
|
||||
*/
|
||||
/**
|
||||
* Converts an ISO 8601 or google.protobuf.Timestamp proto into Protobuf JS.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param timestampValue The value to convert.
|
||||
* @param argumentName The argument name to use in the error message if the
|
||||
* conversion fails. If omitted, 'timestampValue' is used.
|
||||
* @return The value as expected by Protobuf JS or undefined if no input was
|
||||
* provided.
|
||||
*/
|
||||
export declare function timestampFromJson(timestampValue?: string | google.protobuf.ITimestamp, argumentName?: string): google.protobuf.ITimestamp | undefined;
|
||||
/**
|
||||
* Detects 'valueType' from a Proto3 JSON `firestore.v1.Value` proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param proto The `firestore.v1.Value` proto.
|
||||
* @return The string value for 'valueType'.
|
||||
*/
|
||||
export declare function detectValueType(proto: ProtobufJsValue): string;
|
||||
/**
|
||||
* Converts a `firestore.v1.Value` in Proto3 JSON encoding into the
|
||||
* Protobuf JS format expected by this client.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param fieldValue The `firestore.v1.Value` in Proto3 JSON format.
|
||||
* @return The `firestore.v1.Value` in Protobuf JS format.
|
||||
*/
|
||||
export declare function valueFromJson(fieldValue: api.IValue): api.IValue;
|
||||
/**
|
||||
* Converts a map of IValues in Proto3 JSON encoding into the Protobuf JS format
|
||||
* expected by this client. This conversion creates a copy of the underlying
|
||||
* fields.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param document An object with IValues in Proto3 JSON format.
|
||||
* @return The object in Protobuf JS format.
|
||||
*/
|
||||
export declare function fieldsFromJson(document: ApiMapValue): ApiMapValue;
|
||||
+214
@@ -0,0 +1,214 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2019 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const validate_1 = require("./validate");
|
||||
/*!
|
||||
* @module firestore/convert
|
||||
* @private
|
||||
* @internal
|
||||
*
|
||||
* This module contains utility functions to convert
|
||||
* `firestore.v1.Documents` from Proto3 JSON to their equivalent
|
||||
* representation in Protobuf JS. Protobuf JS is the only encoding supported by
|
||||
* this client, and dependencies that use Proto3 JSON (such as the Google Cloud
|
||||
* Functions SDK) are supported through this conversion and its usage in
|
||||
* {@see Firestore#snapshot_}.
|
||||
*/
|
||||
/**
|
||||
* Converts an ISO 8601 or google.protobuf.Timestamp proto into Protobuf JS.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param timestampValue The value to convert.
|
||||
* @param argumentName The argument name to use in the error message if the
|
||||
* conversion fails. If omitted, 'timestampValue' is used.
|
||||
* @return The value as expected by Protobuf JS or undefined if no input was
|
||||
* provided.
|
||||
*/
|
||||
function timestampFromJson(timestampValue, argumentName) {
|
||||
let timestampProto = {};
|
||||
if (typeof timestampValue === 'string') {
|
||||
const date = new Date(timestampValue);
|
||||
const seconds = Math.floor(date.getTime() / 1000);
|
||||
let nanos = 0;
|
||||
if (timestampValue.length > 20) {
|
||||
const nanoString = timestampValue.substring(20, timestampValue.length - 1);
|
||||
const trailingZeroes = 9 - nanoString.length;
|
||||
nanos = Number(nanoString) * Math.pow(10, trailingZeroes);
|
||||
}
|
||||
if (isNaN(seconds) || isNaN(nanos)) {
|
||||
argumentName = argumentName || 'timestampValue';
|
||||
throw new Error(`Specify a valid ISO 8601 timestamp for "${argumentName}".`);
|
||||
}
|
||||
timestampProto = {
|
||||
seconds: seconds || undefined,
|
||||
nanos: nanos || undefined,
|
||||
};
|
||||
}
|
||||
else if (timestampValue !== undefined) {
|
||||
validate_1.validateObject('timestampValue', timestampValue);
|
||||
timestampProto = {
|
||||
seconds: timestampValue.seconds || undefined,
|
||||
nanos: timestampValue.nanos || undefined,
|
||||
};
|
||||
}
|
||||
return timestampProto;
|
||||
}
|
||||
exports.timestampFromJson = timestampFromJson;
|
||||
/**
|
||||
* Converts a Proto3 JSON 'bytesValue' field into Protobuf JS.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param bytesValue The value to convert.
|
||||
* @return The value as expected by Protobuf JS.
|
||||
*/
|
||||
function bytesFromJson(bytesValue) {
|
||||
if (typeof bytesValue === 'string') {
|
||||
return Buffer.from(bytesValue, 'base64');
|
||||
}
|
||||
else {
|
||||
return bytesValue;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Detects 'valueType' from a Proto3 JSON `firestore.v1.Value` proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param proto The `firestore.v1.Value` proto.
|
||||
* @return The string value for 'valueType'.
|
||||
*/
|
||||
function detectValueType(proto) {
|
||||
if (proto.valueType) {
|
||||
return proto.valueType;
|
||||
}
|
||||
const detectedValues = [];
|
||||
if (proto.stringValue !== undefined) {
|
||||
detectedValues.push('stringValue');
|
||||
}
|
||||
if (proto.booleanValue !== undefined) {
|
||||
detectedValues.push('booleanValue');
|
||||
}
|
||||
if (proto.integerValue !== undefined) {
|
||||
detectedValues.push('integerValue');
|
||||
}
|
||||
if (proto.doubleValue !== undefined) {
|
||||
detectedValues.push('doubleValue');
|
||||
}
|
||||
if (proto.timestampValue !== undefined) {
|
||||
detectedValues.push('timestampValue');
|
||||
}
|
||||
if (proto.referenceValue !== undefined) {
|
||||
detectedValues.push('referenceValue');
|
||||
}
|
||||
if (proto.arrayValue !== undefined) {
|
||||
detectedValues.push('arrayValue');
|
||||
}
|
||||
if (proto.nullValue !== undefined) {
|
||||
detectedValues.push('nullValue');
|
||||
}
|
||||
if (proto.mapValue !== undefined) {
|
||||
detectedValues.push('mapValue');
|
||||
}
|
||||
if (proto.geoPointValue !== undefined) {
|
||||
detectedValues.push('geoPointValue');
|
||||
}
|
||||
if (proto.bytesValue !== undefined) {
|
||||
detectedValues.push('bytesValue');
|
||||
}
|
||||
if (detectedValues.length !== 1) {
|
||||
throw new Error(`Unable to infer type value fom '${JSON.stringify(proto)}'.`);
|
||||
}
|
||||
return detectedValues[0];
|
||||
}
|
||||
exports.detectValueType = detectValueType;
|
||||
/**
|
||||
* Converts a `firestore.v1.Value` in Proto3 JSON encoding into the
|
||||
* Protobuf JS format expected by this client.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param fieldValue The `firestore.v1.Value` in Proto3 JSON format.
|
||||
* @return The `firestore.v1.Value` in Protobuf JS format.
|
||||
*/
|
||||
function valueFromJson(fieldValue) {
|
||||
const valueType = detectValueType(fieldValue);
|
||||
switch (valueType) {
|
||||
case 'timestampValue':
|
||||
return {
|
||||
timestampValue: timestampFromJson(fieldValue.timestampValue),
|
||||
};
|
||||
case 'bytesValue':
|
||||
return {
|
||||
bytesValue: bytesFromJson(fieldValue.bytesValue),
|
||||
};
|
||||
case 'doubleValue':
|
||||
return {
|
||||
doubleValue: Number(fieldValue.doubleValue),
|
||||
};
|
||||
case 'arrayValue': {
|
||||
const arrayValue = [];
|
||||
if (Array.isArray(fieldValue.arrayValue.values)) {
|
||||
for (const value of fieldValue.arrayValue.values) {
|
||||
arrayValue.push(valueFromJson(value));
|
||||
}
|
||||
}
|
||||
return {
|
||||
arrayValue: {
|
||||
values: arrayValue,
|
||||
},
|
||||
};
|
||||
}
|
||||
case 'mapValue': {
|
||||
const mapValue = {};
|
||||
const fields = fieldValue.mapValue.fields;
|
||||
if (fields) {
|
||||
for (const prop of Object.keys(fields)) {
|
||||
mapValue[prop] = valueFromJson(fieldValue.mapValue.fields[prop]);
|
||||
}
|
||||
}
|
||||
return {
|
||||
mapValue: {
|
||||
fields: mapValue,
|
||||
},
|
||||
};
|
||||
}
|
||||
default:
|
||||
return fieldValue;
|
||||
}
|
||||
}
|
||||
exports.valueFromJson = valueFromJson;
|
||||
/**
|
||||
* Converts a map of IValues in Proto3 JSON encoding into the Protobuf JS format
|
||||
* expected by this client. This conversion creates a copy of the underlying
|
||||
* fields.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param document An object with IValues in Proto3 JSON format.
|
||||
* @return The object in Protobuf JS format.
|
||||
*/
|
||||
function fieldsFromJson(document) {
|
||||
const result = {};
|
||||
for (const prop of Object.keys(document)) {
|
||||
result[prop] = valueFromJson(document[prop]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
exports.fieldsFromJson = fieldsFromJson;
|
||||
//# sourceMappingURL=convert.js.map
|
||||
+147
@@ -0,0 +1,147 @@
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { QueryDocumentSnapshot } from './document';
|
||||
export declare type DocumentChangeType = 'added' | 'removed' | 'modified';
|
||||
/**
|
||||
* A DocumentChange represents a change to the documents matching a query.
|
||||
* It contains the document affected and the type of change that occurred.
|
||||
*
|
||||
* @class DocumentChange
|
||||
*/
|
||||
export declare class DocumentChange<T = firestore.DocumentData> implements firestore.DocumentChange {
|
||||
private readonly _type;
|
||||
private readonly _document;
|
||||
private readonly _oldIndex;
|
||||
private readonly _newIndex;
|
||||
/**
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param {string} type 'added' | 'removed' | 'modified'.
|
||||
* @param {QueryDocumentSnapshot} document The document.
|
||||
* @param {number} oldIndex The index in the documents array prior to this
|
||||
* change.
|
||||
* @param {number} newIndex The index in the documents array after this
|
||||
* change.
|
||||
*/
|
||||
constructor(type: DocumentChangeType, document: QueryDocumentSnapshot<T>, oldIndex: number, newIndex: number);
|
||||
/**
|
||||
* The type of change ('added', 'modified', or 'removed').
|
||||
*
|
||||
* @type {string}
|
||||
* @name DocumentChange#type
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col').where('foo', '==', 'bar');
|
||||
* let docsArray = [];
|
||||
*
|
||||
* let unsubscribe = query.onSnapshot(querySnapshot => {
|
||||
* for (let change of querySnapshot.docChanges) {
|
||||
* console.log(`Type of change is ${change.type}`);
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Remove this listener.
|
||||
* unsubscribe();
|
||||
*/
|
||||
get type(): DocumentChangeType;
|
||||
/**
|
||||
* The document affected by this change.
|
||||
*
|
||||
* @type {QueryDocumentSnapshot}
|
||||
* @name DocumentChange#doc
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col').where('foo', '==', 'bar');
|
||||
*
|
||||
* let unsubscribe = query.onSnapshot(querySnapshot => {
|
||||
* for (let change of querySnapshot.docChanges) {
|
||||
* console.log(change.doc.data());
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Remove this listener.
|
||||
* unsubscribe();
|
||||
*/
|
||||
get doc(): QueryDocumentSnapshot<T>;
|
||||
/**
|
||||
* The index of the changed document in the result set immediately prior to
|
||||
* this DocumentChange (i.e. supposing that all prior DocumentChange objects
|
||||
* have been applied). Is -1 for 'added' events.
|
||||
*
|
||||
* @type {number}
|
||||
* @name DocumentChange#oldIndex
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col').where('foo', '==', 'bar');
|
||||
* let docsArray = [];
|
||||
*
|
||||
* let unsubscribe = query.onSnapshot(querySnapshot => {
|
||||
* for (let change of querySnapshot.docChanges) {
|
||||
* if (change.oldIndex !== -1) {
|
||||
* docsArray.splice(change.oldIndex, 1);
|
||||
* }
|
||||
* if (change.newIndex !== -1) {
|
||||
* docsArray.splice(change.newIndex, 0, change.doc);
|
||||
* }
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Remove this listener.
|
||||
* unsubscribe();
|
||||
*/
|
||||
get oldIndex(): number;
|
||||
/**
|
||||
* The index of the changed document in the result set immediately after
|
||||
* this DocumentChange (i.e. supposing that all prior DocumentChange
|
||||
* objects and the current DocumentChange object have been applied).
|
||||
* Is -1 for 'removed' events.
|
||||
*
|
||||
* @type {number}
|
||||
* @name DocumentChange#newIndex
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col').where('foo', '==', 'bar');
|
||||
* let docsArray = [];
|
||||
*
|
||||
* let unsubscribe = query.onSnapshot(querySnapshot => {
|
||||
* for (let change of querySnapshot.docChanges) {
|
||||
* if (change.oldIndex !== -1) {
|
||||
* docsArray.splice(change.oldIndex, 1);
|
||||
* }
|
||||
* if (change.newIndex !== -1) {
|
||||
* docsArray.splice(change.newIndex, 0, change.doc);
|
||||
* }
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Remove this listener.
|
||||
* unsubscribe();
|
||||
*/
|
||||
get newIndex(): number;
|
||||
/**
|
||||
* Returns true if the data in this `DocumentChange` is equal to the provided
|
||||
* value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return true if this `DocumentChange` is equal to the provided value.
|
||||
*/
|
||||
isEqual(other: firestore.DocumentChange<T>): boolean;
|
||||
}
|
||||
+166
@@ -0,0 +1,166 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/**
|
||||
* A DocumentChange represents a change to the documents matching a query.
|
||||
* It contains the document affected and the type of change that occurred.
|
||||
*
|
||||
* @class DocumentChange
|
||||
*/
|
||||
class DocumentChange {
|
||||
/**
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param {string} type 'added' | 'removed' | 'modified'.
|
||||
* @param {QueryDocumentSnapshot} document The document.
|
||||
* @param {number} oldIndex The index in the documents array prior to this
|
||||
* change.
|
||||
* @param {number} newIndex The index in the documents array after this
|
||||
* change.
|
||||
*/
|
||||
constructor(type, document, oldIndex, newIndex) {
|
||||
this._type = type;
|
||||
this._document = document;
|
||||
this._oldIndex = oldIndex;
|
||||
this._newIndex = newIndex;
|
||||
}
|
||||
/**
|
||||
* The type of change ('added', 'modified', or 'removed').
|
||||
*
|
||||
* @type {string}
|
||||
* @name DocumentChange#type
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col').where('foo', '==', 'bar');
|
||||
* let docsArray = [];
|
||||
*
|
||||
* let unsubscribe = query.onSnapshot(querySnapshot => {
|
||||
* for (let change of querySnapshot.docChanges) {
|
||||
* console.log(`Type of change is ${change.type}`);
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Remove this listener.
|
||||
* unsubscribe();
|
||||
*/
|
||||
get type() {
|
||||
return this._type;
|
||||
}
|
||||
/**
|
||||
* The document affected by this change.
|
||||
*
|
||||
* @type {QueryDocumentSnapshot}
|
||||
* @name DocumentChange#doc
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col').where('foo', '==', 'bar');
|
||||
*
|
||||
* let unsubscribe = query.onSnapshot(querySnapshot => {
|
||||
* for (let change of querySnapshot.docChanges) {
|
||||
* console.log(change.doc.data());
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Remove this listener.
|
||||
* unsubscribe();
|
||||
*/
|
||||
get doc() {
|
||||
return this._document;
|
||||
}
|
||||
/**
|
||||
* The index of the changed document in the result set immediately prior to
|
||||
* this DocumentChange (i.e. supposing that all prior DocumentChange objects
|
||||
* have been applied). Is -1 for 'added' events.
|
||||
*
|
||||
* @type {number}
|
||||
* @name DocumentChange#oldIndex
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col').where('foo', '==', 'bar');
|
||||
* let docsArray = [];
|
||||
*
|
||||
* let unsubscribe = query.onSnapshot(querySnapshot => {
|
||||
* for (let change of querySnapshot.docChanges) {
|
||||
* if (change.oldIndex !== -1) {
|
||||
* docsArray.splice(change.oldIndex, 1);
|
||||
* }
|
||||
* if (change.newIndex !== -1) {
|
||||
* docsArray.splice(change.newIndex, 0, change.doc);
|
||||
* }
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Remove this listener.
|
||||
* unsubscribe();
|
||||
*/
|
||||
get oldIndex() {
|
||||
return this._oldIndex;
|
||||
}
|
||||
/**
|
||||
* The index of the changed document in the result set immediately after
|
||||
* this DocumentChange (i.e. supposing that all prior DocumentChange
|
||||
* objects and the current DocumentChange object have been applied).
|
||||
* Is -1 for 'removed' events.
|
||||
*
|
||||
* @type {number}
|
||||
* @name DocumentChange#newIndex
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col').where('foo', '==', 'bar');
|
||||
* let docsArray = [];
|
||||
*
|
||||
* let unsubscribe = query.onSnapshot(querySnapshot => {
|
||||
* for (let change of querySnapshot.docChanges) {
|
||||
* if (change.oldIndex !== -1) {
|
||||
* docsArray.splice(change.oldIndex, 1);
|
||||
* }
|
||||
* if (change.newIndex !== -1) {
|
||||
* docsArray.splice(change.newIndex, 0, change.doc);
|
||||
* }
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Remove this listener.
|
||||
* unsubscribe();
|
||||
*/
|
||||
get newIndex() {
|
||||
return this._newIndex;
|
||||
}
|
||||
/**
|
||||
* Returns true if the data in this `DocumentChange` is equal to the provided
|
||||
* value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return true if this `DocumentChange` is equal to the provided value.
|
||||
*/
|
||||
isEqual(other) {
|
||||
if (this === other) {
|
||||
return true;
|
||||
}
|
||||
return (other instanceof DocumentChange &&
|
||||
this._type === other._type &&
|
||||
this._oldIndex === other._oldIndex &&
|
||||
this._newIndex === other._newIndex &&
|
||||
this._document.isEqual(other._document));
|
||||
}
|
||||
}
|
||||
exports.DocumentChange = DocumentChange;
|
||||
//# sourceMappingURL=document-change.js.map
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*!
|
||||
* Copyright 2021 Google LLC. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { DocumentSnapshot } from './document';
|
||||
import { DocumentReference } from './reference';
|
||||
import { FieldPath } from './path';
|
||||
import { Firestore } from './index';
|
||||
/**
|
||||
* A wrapper around BatchGetDocumentsRequest that retries request upon stream
|
||||
* failure and returns ordered results.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class DocumentReader<T> {
|
||||
private firestore;
|
||||
private allDocuments;
|
||||
/** An optional field mask to apply to this read. */
|
||||
fieldMask?: FieldPath[];
|
||||
/** An optional transaction ID to use for this read. */
|
||||
transactionId?: Uint8Array;
|
||||
private outstandingDocuments;
|
||||
private retrievedDocuments;
|
||||
/**
|
||||
* Creates a new DocumentReader that fetches the provided documents (via
|
||||
* `get()`).
|
||||
*
|
||||
* @param firestore The Firestore instance to use.
|
||||
* @param allDocuments The documents to get.
|
||||
*/
|
||||
constructor(firestore: Firestore, allDocuments: Array<DocumentReference<T>>);
|
||||
/**
|
||||
* Invokes the BatchGetDocuments RPC and returns the results.
|
||||
*
|
||||
* @param requestTag A unique client-assigned identifier for this request.
|
||||
*/
|
||||
get(requestTag: string): Promise<Array<DocumentSnapshot<T>>>;
|
||||
private fetchDocuments;
|
||||
}
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2021 Google LLC. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const document_1 = require("./document");
|
||||
const util_1 = require("./util");
|
||||
const logger_1 = require("./logger");
|
||||
/**
|
||||
* A wrapper around BatchGetDocumentsRequest that retries request upon stream
|
||||
* failure and returns ordered results.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class DocumentReader {
|
||||
/**
|
||||
* Creates a new DocumentReader that fetches the provided documents (via
|
||||
* `get()`).
|
||||
*
|
||||
* @param firestore The Firestore instance to use.
|
||||
* @param allDocuments The documents to get.
|
||||
*/
|
||||
constructor(firestore, allDocuments) {
|
||||
this.firestore = firestore;
|
||||
this.allDocuments = allDocuments;
|
||||
this.outstandingDocuments = new Set();
|
||||
this.retrievedDocuments = new Map();
|
||||
for (const docRef of this.allDocuments) {
|
||||
this.outstandingDocuments.add(docRef.formattedName);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Invokes the BatchGetDocuments RPC and returns the results.
|
||||
*
|
||||
* @param requestTag A unique client-assigned identifier for this request.
|
||||
*/
|
||||
async get(requestTag) {
|
||||
await this.fetchDocuments(requestTag);
|
||||
// BatchGetDocuments doesn't preserve document order. We use the request
|
||||
// order to sort the resulting documents.
|
||||
const orderedDocuments = [];
|
||||
for (const docRef of this.allDocuments) {
|
||||
const document = this.retrievedDocuments.get(docRef.formattedName);
|
||||
if (document !== undefined) {
|
||||
// Recreate the DocumentSnapshot with the DocumentReference
|
||||
// containing the original converter.
|
||||
const finalDoc = new document_1.DocumentSnapshotBuilder(docRef);
|
||||
finalDoc.fieldsProto = document._fieldsProto;
|
||||
finalDoc.readTime = document.readTime;
|
||||
finalDoc.createTime = document.createTime;
|
||||
finalDoc.updateTime = document.updateTime;
|
||||
orderedDocuments.push(finalDoc.build());
|
||||
}
|
||||
else {
|
||||
throw new Error(`Did not receive document for "${docRef.path}".`);
|
||||
}
|
||||
}
|
||||
return orderedDocuments;
|
||||
}
|
||||
async fetchDocuments(requestTag) {
|
||||
if (!this.outstandingDocuments.size) {
|
||||
return;
|
||||
}
|
||||
const request = {
|
||||
database: this.firestore.formattedName,
|
||||
transaction: this.transactionId,
|
||||
documents: Array.from(this.outstandingDocuments),
|
||||
};
|
||||
if (this.fieldMask) {
|
||||
const fieldPaths = this.fieldMask.map(fieldPath => fieldPath.formattedName);
|
||||
request.mask = { fieldPaths };
|
||||
}
|
||||
let resultCount = 0;
|
||||
try {
|
||||
const stream = await this.firestore.requestStream('batchGetDocuments', request, requestTag);
|
||||
stream.resume();
|
||||
for await (const response of stream) {
|
||||
let snapshot;
|
||||
if (response.found) {
|
||||
logger_1.logger('DocumentReader.fetchDocuments', requestTag, 'Received document: %s', response.found.name);
|
||||
snapshot = this.firestore.snapshot_(response.found, response.readTime);
|
||||
}
|
||||
else {
|
||||
logger_1.logger('DocumentReader.fetchDocuments', requestTag, 'Document missing: %s', response.missing);
|
||||
snapshot = this.firestore.snapshot_(response.missing, response.readTime);
|
||||
}
|
||||
const path = snapshot.ref.formattedName;
|
||||
this.outstandingDocuments.delete(path);
|
||||
this.retrievedDocuments.set(path, snapshot);
|
||||
++resultCount;
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
const shouldRetry =
|
||||
// Transactional reads are retried via the transaction runner.
|
||||
!this.transactionId &&
|
||||
// Only retry if we made progress.
|
||||
resultCount > 0 &&
|
||||
// Don't retry permanent errors.
|
||||
error.code !== undefined &&
|
||||
!util_1.isPermanentRpcError(error, 'batchGetDocuments');
|
||||
logger_1.logger('DocumentReader.fetchDocuments', requestTag, 'BatchGetDocuments failed with error: %s. Retrying: %s', error, shouldRetry);
|
||||
if (shouldRetry) {
|
||||
return this.fetchDocuments(requestTag);
|
||||
}
|
||||
else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
finally {
|
||||
logger_1.logger('DocumentReader.fetchDocuments', requestTag, 'Received %d results', resultCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.DocumentReader = DocumentReader;
|
||||
//# sourceMappingURL=document-reader.js.map
|
||||
+562
@@ -0,0 +1,562 @@
|
||||
/*!
|
||||
* Copyright 2019 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { google } from '../protos/firestore_v1_proto_api';
|
||||
import { FieldTransform } from './field-value';
|
||||
import { FieldPath } from './path';
|
||||
import { DocumentReference } from './reference';
|
||||
import { Serializer } from './serializer';
|
||||
import { Timestamp } from './timestamp';
|
||||
import { ApiMapValue, UpdateMap } from './types';
|
||||
import api = google.firestore.v1;
|
||||
/**
|
||||
* Returns a builder for DocumentSnapshot and QueryDocumentSnapshot instances.
|
||||
* Invoke `.build()' to assemble the final snapshot.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class DocumentSnapshotBuilder<T = firestore.DocumentData> {
|
||||
readonly ref: DocumentReference<T>;
|
||||
/** The fields of the Firestore `Document` Protobuf backing this document. */
|
||||
fieldsProto?: ApiMapValue;
|
||||
/** The time when this document was read. */
|
||||
readTime?: Timestamp;
|
||||
/** The time when this document was created. */
|
||||
createTime?: Timestamp;
|
||||
/** The time when this document was last updated. */
|
||||
updateTime?: Timestamp;
|
||||
constructor(ref: DocumentReference<T>);
|
||||
/**
|
||||
* Builds the DocumentSnapshot.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns Returns either a QueryDocumentSnapshot (if `fieldsProto` was
|
||||
* provided) or a DocumentSnapshot.
|
||||
*/
|
||||
build(): QueryDocumentSnapshot<T> | DocumentSnapshot<T>;
|
||||
}
|
||||
/**
|
||||
* A DocumentSnapshot is an immutable representation for a document in a
|
||||
* Firestore database. The data can be extracted with
|
||||
* [data()]{@link DocumentSnapshot#data} or
|
||||
* [get(fieldPath)]{@link DocumentSnapshot#get} to get a
|
||||
* specific field.
|
||||
*
|
||||
* <p>For a DocumentSnapshot that points to a non-existing document, any data
|
||||
* access will return 'undefined'. You can use the
|
||||
* [exists]{@link DocumentSnapshot#exists} property to explicitly verify a
|
||||
* document's existence.
|
||||
*
|
||||
* @class DocumentSnapshot
|
||||
*/
|
||||
export declare class DocumentSnapshot<T = firestore.DocumentData> implements firestore.DocumentSnapshot<T> {
|
||||
readonly _fieldsProto?: ApiMapValue | undefined;
|
||||
private _ref;
|
||||
private _serializer;
|
||||
private _readTime;
|
||||
private _createTime;
|
||||
private _updateTime;
|
||||
/**
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param ref The reference to the document.
|
||||
* @param _fieldsProto The fields of the Firestore `Document` Protobuf backing
|
||||
* this document (or undefined if the document does not exist).
|
||||
* @param readTime The time when this snapshot was read (or undefined if
|
||||
* the document exists only locally).
|
||||
* @param createTime The time when the document was created (or undefined if
|
||||
* the document does not exist).
|
||||
* @param updateTime The time when the document was last updated (or undefined
|
||||
* if the document does not exist).
|
||||
*/
|
||||
constructor(ref: DocumentReference<T>, _fieldsProto?: ApiMapValue | undefined, readTime?: Timestamp, createTime?: Timestamp, updateTime?: Timestamp);
|
||||
/**
|
||||
* Creates a DocumentSnapshot from an object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param ref The reference to the document.
|
||||
* @param obj The object to store in the DocumentSnapshot.
|
||||
* @return The created DocumentSnapshot.
|
||||
*/
|
||||
static fromObject<U>(ref: firestore.DocumentReference<U>, obj: firestore.DocumentData): DocumentSnapshot<U>;
|
||||
/**
|
||||
* Creates a DocumentSnapshot from an UpdateMap.
|
||||
*
|
||||
* This methods expands the top-level field paths in a JavaScript map and
|
||||
* turns { foo.bar : foobar } into { foo { bar : foobar }}
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param ref The reference to the document.
|
||||
* @param data The field/value map to expand.
|
||||
* @return The created DocumentSnapshot.
|
||||
*/
|
||||
static fromUpdateMap<U>(ref: firestore.DocumentReference<U>, data: UpdateMap): DocumentSnapshot<U>;
|
||||
/**
|
||||
* True if the document exists.
|
||||
*
|
||||
* @type {boolean}
|
||||
* @name DocumentSnapshot#exists
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then((documentSnapshot) => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* console.log(`Data: ${JSON.stringify(documentSnapshot.data())}`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get exists(): boolean;
|
||||
/**
|
||||
* A [DocumentReference]{@link DocumentReference} for the document
|
||||
* stored in this snapshot.
|
||||
*
|
||||
* @type {DocumentReference}
|
||||
* @name DocumentSnapshot#ref
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then((documentSnapshot) => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* console.log(`Found document at '${documentSnapshot.ref.path}'`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get ref(): DocumentReference<T>;
|
||||
/**
|
||||
* The ID of the document for which this DocumentSnapshot contains data.
|
||||
*
|
||||
* @type {string}
|
||||
* @name DocumentSnapshot#id
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then((documentSnapshot) => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* console.log(`Document found with name '${documentSnapshot.id}'`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get id(): string;
|
||||
/**
|
||||
* The time the document was created. Undefined for documents that don't
|
||||
* exist.
|
||||
*
|
||||
* @type {Timestamp|undefined}
|
||||
* @name DocumentSnapshot#createTime
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(documentSnapshot => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* let createTime = documentSnapshot.createTime;
|
||||
* console.log(`Document created at '${createTime.toDate()}'`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get createTime(): Timestamp | undefined;
|
||||
/**
|
||||
* The time the document was last updated (at the time the snapshot was
|
||||
* generated). Undefined for documents that don't exist.
|
||||
*
|
||||
* @type {Timestamp|undefined}
|
||||
* @name DocumentSnapshot#updateTime
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(documentSnapshot => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* let updateTime = documentSnapshot.updateTime;
|
||||
* console.log(`Document updated at '${updateTime.toDate()}'`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get updateTime(): Timestamp | undefined;
|
||||
/**
|
||||
* The time this snapshot was read.
|
||||
*
|
||||
* @type {Timestamp}
|
||||
* @name DocumentSnapshot#readTime
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(documentSnapshot => {
|
||||
* let readTime = documentSnapshot.readTime;
|
||||
* console.log(`Document read at '${readTime.toDate()}'`);
|
||||
* });
|
||||
*/
|
||||
get readTime(): Timestamp;
|
||||
/**
|
||||
* Retrieves all fields in the document as an object. Returns 'undefined' if
|
||||
* the document doesn't exist.
|
||||
*
|
||||
* @returns {T|undefined} An object containing all fields in the document or
|
||||
* 'undefined' if the document doesn't exist.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(documentSnapshot => {
|
||||
* let data = documentSnapshot.data();
|
||||
* console.log(`Retrieved data: ${JSON.stringify(data)}`);
|
||||
* });
|
||||
*/
|
||||
data(): T | undefined;
|
||||
/**
|
||||
* Retrieves the field specified by `field`.
|
||||
*
|
||||
* @param {string|FieldPath} field The field path
|
||||
* (e.g. 'foo' or 'foo.bar') to a specific field.
|
||||
* @returns {*} The data at the specified field location or undefined if no
|
||||
* such field exists.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({ a: { b: 'c' }}).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(documentSnapshot => {
|
||||
* let field = documentSnapshot.get('a.b');
|
||||
* console.log(`Retrieved field value: ${field}`);
|
||||
* });
|
||||
*/
|
||||
get(field: string | FieldPath): any;
|
||||
/**
|
||||
* Retrieves the field specified by 'fieldPath' in its Protobuf JS
|
||||
* representation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param field The path (e.g. 'foo' or 'foo.bar') to a specific field.
|
||||
* @returns The Protobuf-encoded data at the specified field location or
|
||||
* undefined if no such field exists.
|
||||
*/
|
||||
protoField(field: string | FieldPath): api.IValue | undefined;
|
||||
/**
|
||||
* Convert a document snapshot to the Firestore 'Write' proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toWriteProto(): api.IWrite;
|
||||
/**
|
||||
* Convert a document snapshot to the Firestore 'Document' proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toDocumentProto(): api.IDocument;
|
||||
/**
|
||||
* Returns true if the document's data and path in this `DocumentSnapshot` is
|
||||
* equal to the provided value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return {boolean} true if this `DocumentSnapshot` is equal to the provided
|
||||
* value.
|
||||
*/
|
||||
isEqual(other: firestore.DocumentSnapshot<T>): boolean;
|
||||
}
|
||||
/**
|
||||
* A QueryDocumentSnapshot contains data read from a document in your
|
||||
* Firestore database as part of a query. The document is guaranteed to exist
|
||||
* and its data can be extracted with [data()]{@link QueryDocumentSnapshot#data}
|
||||
* or [get()]{@link DocumentSnapshot#get} to get a specific field.
|
||||
*
|
||||
* A QueryDocumentSnapshot offers the same API surface as a
|
||||
* {@link DocumentSnapshot}. Since query results contain only existing
|
||||
* documents, the [exists]{@link DocumentSnapshot#exists} property will
|
||||
* always be true and [data()]{@link QueryDocumentSnapshot#data} will never
|
||||
* return 'undefined'.
|
||||
*
|
||||
* @class QueryDocumentSnapshot
|
||||
* @extends DocumentSnapshot
|
||||
*/
|
||||
export declare class QueryDocumentSnapshot<T = firestore.DocumentData> extends DocumentSnapshot<T> implements firestore.QueryDocumentSnapshot<T> {
|
||||
/**
|
||||
* The time the document was created.
|
||||
*
|
||||
* @type {Timestamp}
|
||||
* @name QueryDocumentSnapshot#createTime
|
||||
* @readonly
|
||||
* @override
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col');
|
||||
*
|
||||
* query.get().forEach(snapshot => {
|
||||
* console.log(`Document created at '${snapshot.createTime.toDate()}'`);
|
||||
* });
|
||||
*/
|
||||
get createTime(): Timestamp;
|
||||
/**
|
||||
* The time the document was last updated (at the time the snapshot was
|
||||
* generated).
|
||||
*
|
||||
* @type {Timestamp}
|
||||
* @name QueryDocumentSnapshot#updateTime
|
||||
* @readonly
|
||||
* @override
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col');
|
||||
*
|
||||
* query.get().forEach(snapshot => {
|
||||
* console.log(`Document updated at '${snapshot.updateTime.toDate()}'`);
|
||||
* });
|
||||
*/
|
||||
get updateTime(): Timestamp;
|
||||
/**
|
||||
* Retrieves all fields in the document as an object.
|
||||
*
|
||||
* @override
|
||||
*
|
||||
* @returns {T} An object containing all fields in the document.
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col');
|
||||
*
|
||||
* query.get().forEach(documentSnapshot => {
|
||||
* let data = documentSnapshot.data();
|
||||
* console.log(`Retrieved data: ${JSON.stringify(data)}`);
|
||||
* });
|
||||
*/
|
||||
data(): T;
|
||||
}
|
||||
/**
|
||||
* A Firestore Document Mask contains the field paths affected by an update.
|
||||
*
|
||||
* @class
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class DocumentMask {
|
||||
private _sortedPaths;
|
||||
/**
|
||||
* @private
|
||||
* @internal
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param fieldPaths The field paths in this mask.
|
||||
*/
|
||||
constructor(fieldPaths: FieldPath[]);
|
||||
/**
|
||||
* Creates a document mask with the field paths of a document.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param data A map with fields to modify. Only the keys are used to extract
|
||||
* the document mask.
|
||||
*/
|
||||
static fromUpdateMap(data: UpdateMap): DocumentMask;
|
||||
/**
|
||||
* Creates a document mask from an array of field paths.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param fieldMask A list of field paths.
|
||||
*/
|
||||
static fromFieldMask(fieldMask: Array<string | firestore.FieldPath>): DocumentMask;
|
||||
/**
|
||||
* Creates a document mask with the field names of a document.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param data An object with fields to modify. Only the keys are used to
|
||||
* extract the document mask.
|
||||
*/
|
||||
static fromObject(data: firestore.DocumentData): DocumentMask;
|
||||
/**
|
||||
* Returns true if this document mask contains no fields.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @return {boolean} Whether this document mask is empty.
|
||||
*/
|
||||
get isEmpty(): boolean;
|
||||
/**
|
||||
* Removes the specified values from a sorted field path array.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param input A sorted array of FieldPaths.
|
||||
* @param values An array of FieldPaths to remove.
|
||||
*/
|
||||
private static removeFromSortedArray;
|
||||
/**
|
||||
* Removes the field path specified in 'fieldPaths' from this document mask.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param fieldPaths An array of FieldPaths.
|
||||
*/
|
||||
removeFields(fieldPaths: FieldPath[]): void;
|
||||
/**
|
||||
* Returns whether this document mask contains 'fieldPath'.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param fieldPath The field path to test.
|
||||
* @return Whether this document mask contains 'fieldPath'.
|
||||
*/
|
||||
contains(fieldPath: FieldPath): boolean;
|
||||
/**
|
||||
* Removes all properties from 'data' that are not contained in this document
|
||||
* mask.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param data An object to filter.
|
||||
* @return A shallow copy of the object filtered by this document mask.
|
||||
*/
|
||||
applyTo(data: firestore.DocumentData): firestore.DocumentData;
|
||||
/**
|
||||
* Converts a document mask to the Firestore 'DocumentMask' Proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns A Firestore 'DocumentMask' Proto.
|
||||
*/
|
||||
toProto(): api.IDocumentMask;
|
||||
}
|
||||
/**
|
||||
* A Firestore Document Transform.
|
||||
*
|
||||
* A DocumentTransform contains pending server-side transforms and their
|
||||
* corresponding field paths.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @class
|
||||
*/
|
||||
export declare class DocumentTransform<T = firestore.DocumentData> {
|
||||
private readonly ref;
|
||||
private readonly transforms;
|
||||
/**
|
||||
* @private
|
||||
* @internal
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param ref The DocumentReference for this transform.
|
||||
* @param transforms A Map of FieldPaths to FieldTransforms.
|
||||
*/
|
||||
constructor(ref: DocumentReference<T>, transforms: Map<FieldPath, FieldTransform>);
|
||||
/**
|
||||
* Generates a DocumentTransform from a JavaScript object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param ref The `DocumentReference` to use for the DocumentTransform.
|
||||
* @param obj The object to extract the transformations from.
|
||||
* @returns The Document Transform.
|
||||
*/
|
||||
static fromObject<T>(ref: firestore.DocumentReference<T>, obj: firestore.DocumentData): DocumentTransform<T>;
|
||||
/**
|
||||
* Generates a DocumentTransform from an Update Map.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param ref The `DocumentReference` to use for the DocumentTransform.
|
||||
* @param data The update data to extract the transformations from.
|
||||
* @returns The Document Transform.
|
||||
*/
|
||||
static fromUpdateMap<T>(ref: firestore.DocumentReference<T>, data: UpdateMap): DocumentTransform<T>;
|
||||
/**
|
||||
* Whether this DocumentTransform contains any actionable transformations.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get isEmpty(): boolean;
|
||||
/**
|
||||
* Returns the array of fields in this DocumentTransform.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get fields(): FieldPath[];
|
||||
/**
|
||||
* Validates the user provided field values in this document transform.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
validate(): void;
|
||||
/**
|
||||
* Converts a document transform to the Firestore 'FieldTransform' Proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param serializer The Firestore serializer
|
||||
* @returns A list of Firestore 'FieldTransform' Protos
|
||||
*/
|
||||
toProto(serializer: Serializer): api.DocumentTransform.IFieldTransform[];
|
||||
}
|
||||
/**
|
||||
* A Firestore Precondition encapsulates options for database writes.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @class
|
||||
*/
|
||||
export declare class Precondition {
|
||||
private _exists?;
|
||||
private _lastUpdateTime?;
|
||||
/**
|
||||
* @private
|
||||
* @internal
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param options.exists - Whether the referenced document should exist in
|
||||
* Firestore,
|
||||
* @param options.lastUpdateTime - The last update time of the referenced
|
||||
* document in Firestore.
|
||||
* @param options
|
||||
*/
|
||||
constructor(options?: {
|
||||
exists?: boolean;
|
||||
lastUpdateTime?: firestore.Timestamp;
|
||||
});
|
||||
/**
|
||||
* Generates the Protobuf `Preconditon` object for this precondition.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The `Preconditon` Protobuf object or 'null' if there are no
|
||||
* preconditions.
|
||||
*/
|
||||
toProto(): api.IPrecondition | null;
|
||||
/**
|
||||
* Whether this DocumentTransform contains any enforcement.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get isEmpty(): boolean;
|
||||
}
|
||||
+905
@@ -0,0 +1,905 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2019 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const deepEqual = require("fast-deep-equal");
|
||||
const assert = require("assert");
|
||||
const field_value_1 = require("./field-value");
|
||||
const path_1 = require("./path");
|
||||
const reference_1 = require("./reference");
|
||||
const types_1 = require("./types");
|
||||
const util_1 = require("./util");
|
||||
/**
|
||||
* Returns a builder for DocumentSnapshot and QueryDocumentSnapshot instances.
|
||||
* Invoke `.build()' to assemble the final snapshot.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class DocumentSnapshotBuilder {
|
||||
// We include the DocumentReference in the constructor in order to allow the
|
||||
// DocumentSnapshotBuilder to be typed with <T> when it is constructed.
|
||||
constructor(ref) {
|
||||
this.ref = ref;
|
||||
}
|
||||
/**
|
||||
* Builds the DocumentSnapshot.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns Returns either a QueryDocumentSnapshot (if `fieldsProto` was
|
||||
* provided) or a DocumentSnapshot.
|
||||
*/
|
||||
build() {
|
||||
assert((this.fieldsProto !== undefined) === (this.createTime !== undefined), 'Create time should be set iff document exists.');
|
||||
assert((this.fieldsProto !== undefined) === (this.updateTime !== undefined), 'Update time should be set iff document exists.');
|
||||
return this.fieldsProto
|
||||
? new QueryDocumentSnapshot(this.ref, this.fieldsProto, this.readTime, this.createTime, this.updateTime)
|
||||
: new DocumentSnapshot(this.ref, undefined, this.readTime);
|
||||
}
|
||||
}
|
||||
exports.DocumentSnapshotBuilder = DocumentSnapshotBuilder;
|
||||
/**
|
||||
* A DocumentSnapshot is an immutable representation for a document in a
|
||||
* Firestore database. The data can be extracted with
|
||||
* [data()]{@link DocumentSnapshot#data} or
|
||||
* [get(fieldPath)]{@link DocumentSnapshot#get} to get a
|
||||
* specific field.
|
||||
*
|
||||
* <p>For a DocumentSnapshot that points to a non-existing document, any data
|
||||
* access will return 'undefined'. You can use the
|
||||
* [exists]{@link DocumentSnapshot#exists} property to explicitly verify a
|
||||
* document's existence.
|
||||
*
|
||||
* @class DocumentSnapshot
|
||||
*/
|
||||
class DocumentSnapshot {
|
||||
/**
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param ref The reference to the document.
|
||||
* @param _fieldsProto The fields of the Firestore `Document` Protobuf backing
|
||||
* this document (or undefined if the document does not exist).
|
||||
* @param readTime The time when this snapshot was read (or undefined if
|
||||
* the document exists only locally).
|
||||
* @param createTime The time when the document was created (or undefined if
|
||||
* the document does not exist).
|
||||
* @param updateTime The time when the document was last updated (or undefined
|
||||
* if the document does not exist).
|
||||
*/
|
||||
constructor(ref, _fieldsProto, readTime, createTime, updateTime) {
|
||||
this._fieldsProto = _fieldsProto;
|
||||
this._ref = ref;
|
||||
this._serializer = ref.firestore._serializer;
|
||||
this._readTime = readTime;
|
||||
this._createTime = createTime;
|
||||
this._updateTime = updateTime;
|
||||
}
|
||||
/**
|
||||
* Creates a DocumentSnapshot from an object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param ref The reference to the document.
|
||||
* @param obj The object to store in the DocumentSnapshot.
|
||||
* @return The created DocumentSnapshot.
|
||||
*/
|
||||
static fromObject(ref, obj) {
|
||||
const serializer = ref.firestore._serializer;
|
||||
return new DocumentSnapshot(ref, serializer.encodeFields(obj));
|
||||
}
|
||||
/**
|
||||
* Creates a DocumentSnapshot from an UpdateMap.
|
||||
*
|
||||
* This methods expands the top-level field paths in a JavaScript map and
|
||||
* turns { foo.bar : foobar } into { foo { bar : foobar }}
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param ref The reference to the document.
|
||||
* @param data The field/value map to expand.
|
||||
* @return The created DocumentSnapshot.
|
||||
*/
|
||||
static fromUpdateMap(ref, data) {
|
||||
const serializer = ref.firestore._serializer;
|
||||
/**
|
||||
* Merges 'value' at the field path specified by the path array into
|
||||
* 'target'.
|
||||
*/
|
||||
function merge(target, value, path, pos) {
|
||||
const key = path[pos];
|
||||
const isLast = pos === path.length - 1;
|
||||
if (target[key] === undefined) {
|
||||
if (isLast) {
|
||||
if (value instanceof field_value_1.FieldTransform) {
|
||||
// If there is already data at this path, we need to retain it.
|
||||
// Otherwise, we don't include it in the DocumentSnapshot.
|
||||
return !util_1.isEmpty(target) ? target : null;
|
||||
}
|
||||
// The merge is done.
|
||||
const leafNode = serializer.encodeValue(value);
|
||||
if (leafNode) {
|
||||
target[key] = leafNode;
|
||||
}
|
||||
return target;
|
||||
}
|
||||
else {
|
||||
// We need to expand the target object.
|
||||
const childNode = {
|
||||
mapValue: {
|
||||
fields: {},
|
||||
},
|
||||
};
|
||||
const nestedValue = merge(childNode.mapValue.fields, value, path, pos + 1);
|
||||
if (nestedValue) {
|
||||
childNode.mapValue.fields = nestedValue;
|
||||
target[key] = childNode;
|
||||
return target;
|
||||
}
|
||||
else {
|
||||
return !util_1.isEmpty(target) ? target : null;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
assert(!isLast, "Can't merge current value into a nested object");
|
||||
target[key].mapValue.fields = merge(target[key].mapValue.fields, value, path, pos + 1);
|
||||
return target;
|
||||
}
|
||||
}
|
||||
const res = {};
|
||||
for (const [key, value] of data) {
|
||||
const path = key.toArray();
|
||||
merge(res, value, path, 0);
|
||||
}
|
||||
return new DocumentSnapshot(ref, res);
|
||||
}
|
||||
/**
|
||||
* True if the document exists.
|
||||
*
|
||||
* @type {boolean}
|
||||
* @name DocumentSnapshot#exists
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then((documentSnapshot) => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* console.log(`Data: ${JSON.stringify(documentSnapshot.data())}`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get exists() {
|
||||
return this._fieldsProto !== undefined;
|
||||
}
|
||||
/**
|
||||
* A [DocumentReference]{@link DocumentReference} for the document
|
||||
* stored in this snapshot.
|
||||
*
|
||||
* @type {DocumentReference}
|
||||
* @name DocumentSnapshot#ref
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then((documentSnapshot) => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* console.log(`Found document at '${documentSnapshot.ref.path}'`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get ref() {
|
||||
return this._ref;
|
||||
}
|
||||
/**
|
||||
* The ID of the document for which this DocumentSnapshot contains data.
|
||||
*
|
||||
* @type {string}
|
||||
* @name DocumentSnapshot#id
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then((documentSnapshot) => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* console.log(`Document found with name '${documentSnapshot.id}'`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get id() {
|
||||
return this._ref.id;
|
||||
}
|
||||
/**
|
||||
* The time the document was created. Undefined for documents that don't
|
||||
* exist.
|
||||
*
|
||||
* @type {Timestamp|undefined}
|
||||
* @name DocumentSnapshot#createTime
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(documentSnapshot => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* let createTime = documentSnapshot.createTime;
|
||||
* console.log(`Document created at '${createTime.toDate()}'`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get createTime() {
|
||||
return this._createTime;
|
||||
}
|
||||
/**
|
||||
* The time the document was last updated (at the time the snapshot was
|
||||
* generated). Undefined for documents that don't exist.
|
||||
*
|
||||
* @type {Timestamp|undefined}
|
||||
* @name DocumentSnapshot#updateTime
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(documentSnapshot => {
|
||||
* if (documentSnapshot.exists) {
|
||||
* let updateTime = documentSnapshot.updateTime;
|
||||
* console.log(`Document updated at '${updateTime.toDate()}'`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
get updateTime() {
|
||||
return this._updateTime;
|
||||
}
|
||||
/**
|
||||
* The time this snapshot was read.
|
||||
*
|
||||
* @type {Timestamp}
|
||||
* @name DocumentSnapshot#readTime
|
||||
* @readonly
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(documentSnapshot => {
|
||||
* let readTime = documentSnapshot.readTime;
|
||||
* console.log(`Document read at '${readTime.toDate()}'`);
|
||||
* });
|
||||
*/
|
||||
get readTime() {
|
||||
if (this._readTime === undefined) {
|
||||
throw new Error("Called 'readTime' on a local document");
|
||||
}
|
||||
return this._readTime;
|
||||
}
|
||||
/**
|
||||
* Retrieves all fields in the document as an object. Returns 'undefined' if
|
||||
* the document doesn't exist.
|
||||
*
|
||||
* @returns {T|undefined} An object containing all fields in the document or
|
||||
* 'undefined' if the document doesn't exist.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(documentSnapshot => {
|
||||
* let data = documentSnapshot.data();
|
||||
* console.log(`Retrieved data: ${JSON.stringify(data)}`);
|
||||
* });
|
||||
*/
|
||||
data() {
|
||||
const fields = this._fieldsProto;
|
||||
if (fields === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
// We only want to use the converter and create a new QueryDocumentSnapshot
|
||||
// if a converter has been provided.
|
||||
if (this.ref._converter !== types_1.defaultConverter()) {
|
||||
const untypedReference = new reference_1.DocumentReference(this.ref.firestore, this.ref._path);
|
||||
return this.ref._converter.fromFirestore(new QueryDocumentSnapshot(untypedReference, this._fieldsProto, this.readTime, this.createTime, this.updateTime));
|
||||
}
|
||||
else {
|
||||
const obj = {};
|
||||
for (const prop of Object.keys(fields)) {
|
||||
obj[prop] = this._serializer.decodeValue(fields[prop]);
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Retrieves the field specified by `field`.
|
||||
*
|
||||
* @param {string|FieldPath} field The field path
|
||||
* (e.g. 'foo' or 'foo.bar') to a specific field.
|
||||
* @returns {*} The data at the specified field location or undefined if no
|
||||
* such field exists.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({ a: { b: 'c' }}).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(documentSnapshot => {
|
||||
* let field = documentSnapshot.get('a.b');
|
||||
* console.log(`Retrieved field value: ${field}`);
|
||||
* });
|
||||
*/
|
||||
// We deliberately use `any` in the external API to not impose type-checking
|
||||
// on end users.
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
get(field) {
|
||||
path_1.validateFieldPath('field', field);
|
||||
const protoField = this.protoField(field);
|
||||
if (protoField === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
return this._serializer.decodeValue(protoField);
|
||||
}
|
||||
/**
|
||||
* Retrieves the field specified by 'fieldPath' in its Protobuf JS
|
||||
* representation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param field The path (e.g. 'foo' or 'foo.bar') to a specific field.
|
||||
* @returns The Protobuf-encoded data at the specified field location or
|
||||
* undefined if no such field exists.
|
||||
*/
|
||||
protoField(field) {
|
||||
let fields = this._fieldsProto;
|
||||
if (fields === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
const components = path_1.FieldPath.fromArgument(field).toArray();
|
||||
while (components.length > 1) {
|
||||
fields = fields[components.shift()];
|
||||
if (!fields || !fields.mapValue) {
|
||||
return undefined;
|
||||
}
|
||||
fields = fields.mapValue.fields;
|
||||
}
|
||||
return fields[components[0]];
|
||||
}
|
||||
/**
|
||||
* Convert a document snapshot to the Firestore 'Write' proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toWriteProto() {
|
||||
return {
|
||||
update: {
|
||||
name: this._ref.formattedName,
|
||||
fields: this._fieldsProto,
|
||||
},
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Convert a document snapshot to the Firestore 'Document' proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toDocumentProto() {
|
||||
var _a, _b;
|
||||
return {
|
||||
name: this._ref.formattedName,
|
||||
createTime: (_a = this.createTime) === null || _a === void 0 ? void 0 : _a.toProto().timestampValue,
|
||||
updateTime: (_b = this.updateTime) === null || _b === void 0 ? void 0 : _b.toProto().timestampValue,
|
||||
fields: this._fieldsProto,
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Returns true if the document's data and path in this `DocumentSnapshot` is
|
||||
* equal to the provided value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return {boolean} true if this `DocumentSnapshot` is equal to the provided
|
||||
* value.
|
||||
*/
|
||||
isEqual(other) {
|
||||
// Since the read time is different on every document read, we explicitly
|
||||
// ignore all document metadata in this comparison.
|
||||
return (this === other ||
|
||||
(other instanceof DocumentSnapshot &&
|
||||
this._ref.isEqual(other._ref) &&
|
||||
deepEqual(this._fieldsProto, other._fieldsProto)));
|
||||
}
|
||||
}
|
||||
exports.DocumentSnapshot = DocumentSnapshot;
|
||||
/**
|
||||
* A QueryDocumentSnapshot contains data read from a document in your
|
||||
* Firestore database as part of a query. The document is guaranteed to exist
|
||||
* and its data can be extracted with [data()]{@link QueryDocumentSnapshot#data}
|
||||
* or [get()]{@link DocumentSnapshot#get} to get a specific field.
|
||||
*
|
||||
* A QueryDocumentSnapshot offers the same API surface as a
|
||||
* {@link DocumentSnapshot}. Since query results contain only existing
|
||||
* documents, the [exists]{@link DocumentSnapshot#exists} property will
|
||||
* always be true and [data()]{@link QueryDocumentSnapshot#data} will never
|
||||
* return 'undefined'.
|
||||
*
|
||||
* @class QueryDocumentSnapshot
|
||||
* @extends DocumentSnapshot
|
||||
*/
|
||||
class QueryDocumentSnapshot extends DocumentSnapshot {
|
||||
/**
|
||||
* The time the document was created.
|
||||
*
|
||||
* @type {Timestamp}
|
||||
* @name QueryDocumentSnapshot#createTime
|
||||
* @readonly
|
||||
* @override
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col');
|
||||
*
|
||||
* query.get().forEach(snapshot => {
|
||||
* console.log(`Document created at '${snapshot.createTime.toDate()}'`);
|
||||
* });
|
||||
*/
|
||||
get createTime() {
|
||||
return super.createTime;
|
||||
}
|
||||
/**
|
||||
* The time the document was last updated (at the time the snapshot was
|
||||
* generated).
|
||||
*
|
||||
* @type {Timestamp}
|
||||
* @name QueryDocumentSnapshot#updateTime
|
||||
* @readonly
|
||||
* @override
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col');
|
||||
*
|
||||
* query.get().forEach(snapshot => {
|
||||
* console.log(`Document updated at '${snapshot.updateTime.toDate()}'`);
|
||||
* });
|
||||
*/
|
||||
get updateTime() {
|
||||
return super.updateTime;
|
||||
}
|
||||
/**
|
||||
* Retrieves all fields in the document as an object.
|
||||
*
|
||||
* @override
|
||||
*
|
||||
* @returns {T} An object containing all fields in the document.
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col');
|
||||
*
|
||||
* query.get().forEach(documentSnapshot => {
|
||||
* let data = documentSnapshot.data();
|
||||
* console.log(`Retrieved data: ${JSON.stringify(data)}`);
|
||||
* });
|
||||
*/
|
||||
data() {
|
||||
const data = super.data();
|
||||
if (!data) {
|
||||
throw new Error('The data in a QueryDocumentSnapshot should always exist.');
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
exports.QueryDocumentSnapshot = QueryDocumentSnapshot;
|
||||
/**
|
||||
* A Firestore Document Mask contains the field paths affected by an update.
|
||||
*
|
||||
* @class
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class DocumentMask {
|
||||
/**
|
||||
* @private
|
||||
* @internal
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param fieldPaths The field paths in this mask.
|
||||
*/
|
||||
constructor(fieldPaths) {
|
||||
this._sortedPaths = fieldPaths;
|
||||
this._sortedPaths.sort((a, b) => a.compareTo(b));
|
||||
}
|
||||
/**
|
||||
* Creates a document mask with the field paths of a document.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param data A map with fields to modify. Only the keys are used to extract
|
||||
* the document mask.
|
||||
*/
|
||||
static fromUpdateMap(data) {
|
||||
const fieldPaths = [];
|
||||
data.forEach((value, key) => {
|
||||
if (!(value instanceof field_value_1.FieldTransform) || value.includeInDocumentMask) {
|
||||
fieldPaths.push(path_1.FieldPath.fromArgument(key));
|
||||
}
|
||||
});
|
||||
return new DocumentMask(fieldPaths);
|
||||
}
|
||||
/**
|
||||
* Creates a document mask from an array of field paths.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param fieldMask A list of field paths.
|
||||
*/
|
||||
static fromFieldMask(fieldMask) {
|
||||
const fieldPaths = [];
|
||||
for (const fieldPath of fieldMask) {
|
||||
fieldPaths.push(path_1.FieldPath.fromArgument(fieldPath));
|
||||
}
|
||||
return new DocumentMask(fieldPaths);
|
||||
}
|
||||
/**
|
||||
* Creates a document mask with the field names of a document.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param data An object with fields to modify. Only the keys are used to
|
||||
* extract the document mask.
|
||||
*/
|
||||
static fromObject(data) {
|
||||
const fieldPaths = [];
|
||||
function extractFieldPaths(currentData, currentPath) {
|
||||
let isEmpty = true;
|
||||
for (const key of Object.keys(currentData)) {
|
||||
isEmpty = false;
|
||||
// We don't split on dots since fromObject is called with
|
||||
// DocumentData.
|
||||
const childSegment = new path_1.FieldPath(key);
|
||||
const childPath = currentPath
|
||||
? currentPath.append(childSegment)
|
||||
: childSegment;
|
||||
const value = currentData[key];
|
||||
if (value instanceof field_value_1.FieldTransform) {
|
||||
if (value.includeInDocumentMask) {
|
||||
fieldPaths.push(childPath);
|
||||
}
|
||||
}
|
||||
else if (util_1.isPlainObject(value)) {
|
||||
extractFieldPaths(value, childPath);
|
||||
}
|
||||
else if (value !== undefined) {
|
||||
// If the value is undefined it can never participate in the document
|
||||
// mask. With `ignoreUndefinedProperties` set to false,
|
||||
// `validateDocumentData` will reject an undefined value before even
|
||||
// computing the document mask.
|
||||
fieldPaths.push(childPath);
|
||||
}
|
||||
}
|
||||
// Add a field path for an explicitly updated empty map.
|
||||
if (currentPath && isEmpty) {
|
||||
fieldPaths.push(currentPath);
|
||||
}
|
||||
}
|
||||
extractFieldPaths(data);
|
||||
return new DocumentMask(fieldPaths);
|
||||
}
|
||||
/**
|
||||
* Returns true if this document mask contains no fields.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @return {boolean} Whether this document mask is empty.
|
||||
*/
|
||||
get isEmpty() {
|
||||
return this._sortedPaths.length === 0;
|
||||
}
|
||||
/**
|
||||
* Removes the specified values from a sorted field path array.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param input A sorted array of FieldPaths.
|
||||
* @param values An array of FieldPaths to remove.
|
||||
*/
|
||||
static removeFromSortedArray(input, values) {
|
||||
for (let i = 0; i < input.length;) {
|
||||
let removed = false;
|
||||
for (const fieldPath of values) {
|
||||
if (input[i].isEqual(fieldPath)) {
|
||||
input.splice(i, 1);
|
||||
removed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!removed) {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Removes the field path specified in 'fieldPaths' from this document mask.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param fieldPaths An array of FieldPaths.
|
||||
*/
|
||||
removeFields(fieldPaths) {
|
||||
DocumentMask.removeFromSortedArray(this._sortedPaths, fieldPaths);
|
||||
}
|
||||
/**
|
||||
* Returns whether this document mask contains 'fieldPath'.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param fieldPath The field path to test.
|
||||
* @return Whether this document mask contains 'fieldPath'.
|
||||
*/
|
||||
contains(fieldPath) {
|
||||
for (const sortedPath of this._sortedPaths) {
|
||||
const cmp = sortedPath.compareTo(fieldPath);
|
||||
if (cmp === 0) {
|
||||
return true;
|
||||
}
|
||||
else if (cmp > 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Removes all properties from 'data' that are not contained in this document
|
||||
* mask.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param data An object to filter.
|
||||
* @return A shallow copy of the object filtered by this document mask.
|
||||
*/
|
||||
applyTo(data) {
|
||||
/*!
|
||||
* Applies this DocumentMask to 'data' and computes the list of field paths
|
||||
* that were specified in the mask but are not present in 'data'.
|
||||
*/
|
||||
const applyDocumentMask = data => {
|
||||
const remainingPaths = this._sortedPaths.slice(0);
|
||||
const processObject = (currentData, currentPath) => {
|
||||
let result = null;
|
||||
Object.keys(currentData).forEach(key => {
|
||||
const childPath = currentPath
|
||||
? currentPath.append(key)
|
||||
: new path_1.FieldPath(key);
|
||||
if (this.contains(childPath)) {
|
||||
DocumentMask.removeFromSortedArray(remainingPaths, [childPath]);
|
||||
result = result || {};
|
||||
result[key] = currentData[key];
|
||||
}
|
||||
else if (util_1.isObject(currentData[key])) {
|
||||
const childObject = processObject(currentData[key], childPath);
|
||||
if (childObject) {
|
||||
result = result || {};
|
||||
result[key] = childObject;
|
||||
}
|
||||
}
|
||||
});
|
||||
return result;
|
||||
};
|
||||
// processObject() returns 'null' if the DocumentMask is empty.
|
||||
const filteredData = processObject(data) || {};
|
||||
return {
|
||||
filteredData,
|
||||
remainingPaths,
|
||||
};
|
||||
};
|
||||
const result = applyDocumentMask(data);
|
||||
if (result.remainingPaths.length !== 0) {
|
||||
throw new Error(`Input data is missing for field "${result.remainingPaths[0]}".`);
|
||||
}
|
||||
return result.filteredData;
|
||||
}
|
||||
/**
|
||||
* Converts a document mask to the Firestore 'DocumentMask' Proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns A Firestore 'DocumentMask' Proto.
|
||||
*/
|
||||
toProto() {
|
||||
if (this.isEmpty) {
|
||||
return {};
|
||||
}
|
||||
const encodedPaths = [];
|
||||
for (const fieldPath of this._sortedPaths) {
|
||||
encodedPaths.push(fieldPath.formattedName);
|
||||
}
|
||||
return {
|
||||
fieldPaths: encodedPaths,
|
||||
};
|
||||
}
|
||||
}
|
||||
exports.DocumentMask = DocumentMask;
|
||||
/**
|
||||
* A Firestore Document Transform.
|
||||
*
|
||||
* A DocumentTransform contains pending server-side transforms and their
|
||||
* corresponding field paths.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @class
|
||||
*/
|
||||
class DocumentTransform {
|
||||
/**
|
||||
* @private
|
||||
* @internal
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param ref The DocumentReference for this transform.
|
||||
* @param transforms A Map of FieldPaths to FieldTransforms.
|
||||
*/
|
||||
constructor(ref, transforms) {
|
||||
this.ref = ref;
|
||||
this.transforms = transforms;
|
||||
}
|
||||
/**
|
||||
* Generates a DocumentTransform from a JavaScript object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param ref The `DocumentReference` to use for the DocumentTransform.
|
||||
* @param obj The object to extract the transformations from.
|
||||
* @returns The Document Transform.
|
||||
*/
|
||||
static fromObject(ref, obj) {
|
||||
const updateMap = new Map();
|
||||
for (const prop of Object.keys(obj)) {
|
||||
updateMap.set(new path_1.FieldPath(prop), obj[prop]);
|
||||
}
|
||||
return DocumentTransform.fromUpdateMap(ref, updateMap);
|
||||
}
|
||||
/**
|
||||
* Generates a DocumentTransform from an Update Map.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param ref The `DocumentReference` to use for the DocumentTransform.
|
||||
* @param data The update data to extract the transformations from.
|
||||
* @returns The Document Transform.
|
||||
*/
|
||||
static fromUpdateMap(ref, data) {
|
||||
const transforms = new Map();
|
||||
function encode_(val, path, allowTransforms) {
|
||||
if (val instanceof field_value_1.FieldTransform && val.includeInDocumentTransform) {
|
||||
if (allowTransforms) {
|
||||
transforms.set(path, val);
|
||||
}
|
||||
else {
|
||||
throw new Error(`${val.methodName}() is not supported inside of array values.`);
|
||||
}
|
||||
}
|
||||
else if (Array.isArray(val)) {
|
||||
for (let i = 0; i < val.length; ++i) {
|
||||
// We need to verify that no array value contains a document transform
|
||||
encode_(val[i], path.append(String(i)), false);
|
||||
}
|
||||
}
|
||||
else if (util_1.isPlainObject(val)) {
|
||||
for (const prop of Object.keys(val)) {
|
||||
encode_(val[prop], path.append(new path_1.FieldPath(prop)), allowTransforms);
|
||||
}
|
||||
}
|
||||
}
|
||||
data.forEach((value, key) => {
|
||||
encode_(value, path_1.FieldPath.fromArgument(key), true);
|
||||
});
|
||||
return new DocumentTransform(ref, transforms);
|
||||
}
|
||||
/**
|
||||
* Whether this DocumentTransform contains any actionable transformations.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get isEmpty() {
|
||||
return this.transforms.size === 0;
|
||||
}
|
||||
/**
|
||||
* Returns the array of fields in this DocumentTransform.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get fields() {
|
||||
return Array.from(this.transforms.keys());
|
||||
}
|
||||
/**
|
||||
* Validates the user provided field values in this document transform.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
validate() {
|
||||
const allowUndefined = !!this.ref.firestore._settings.ignoreUndefinedProperties;
|
||||
this.transforms.forEach(transform => transform.validate(allowUndefined));
|
||||
}
|
||||
/**
|
||||
* Converts a document transform to the Firestore 'FieldTransform' Proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param serializer The Firestore serializer
|
||||
* @returns A list of Firestore 'FieldTransform' Protos
|
||||
*/
|
||||
toProto(serializer) {
|
||||
return Array.from(this.transforms, ([path, transform]) => transform.toProto(serializer, path));
|
||||
}
|
||||
}
|
||||
exports.DocumentTransform = DocumentTransform;
|
||||
/**
|
||||
* A Firestore Precondition encapsulates options for database writes.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @class
|
||||
*/
|
||||
class Precondition {
|
||||
/**
|
||||
* @private
|
||||
* @internal
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param options.exists - Whether the referenced document should exist in
|
||||
* Firestore,
|
||||
* @param options.lastUpdateTime - The last update time of the referenced
|
||||
* document in Firestore.
|
||||
* @param options
|
||||
*/
|
||||
constructor(options) {
|
||||
if (options !== undefined) {
|
||||
this._exists = options.exists;
|
||||
this._lastUpdateTime = options.lastUpdateTime;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Generates the Protobuf `Preconditon` object for this precondition.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The `Preconditon` Protobuf object or 'null' if there are no
|
||||
* preconditions.
|
||||
*/
|
||||
toProto() {
|
||||
if (this.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
const proto = {};
|
||||
if (this._lastUpdateTime !== undefined) {
|
||||
proto.updateTime = this._lastUpdateTime.toProto().timestampValue;
|
||||
}
|
||||
else {
|
||||
proto.exists = this._exists;
|
||||
}
|
||||
return proto;
|
||||
}
|
||||
/**
|
||||
* Whether this DocumentTransform contains any enforcement.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get isEmpty() {
|
||||
return this._exists === undefined && !this._lastUpdateTime;
|
||||
}
|
||||
}
|
||||
exports.Precondition = Precondition;
|
||||
//# sourceMappingURL=document.js.map
|
||||
+239
@@ -0,0 +1,239 @@
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import * as proto from '../protos/firestore_v1_proto_api';
|
||||
import { FieldPath } from './path';
|
||||
import { Serializer } from './serializer';
|
||||
import api = proto.google.firestore.v1;
|
||||
/**
|
||||
* Sentinel values that can be used when writing documents with set(), create()
|
||||
* or update().
|
||||
*
|
||||
* @class FieldValue
|
||||
*/
|
||||
export declare class FieldValue implements firestore.FieldValue {
|
||||
/**
|
||||
* @hideconstructor
|
||||
*/
|
||||
constructor();
|
||||
/**
|
||||
* Returns a sentinel for use with update() or set() with {merge:true} to mark
|
||||
* a field for deletion.
|
||||
*
|
||||
* @returns {FieldValue} The sentinel value to use in your objects.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* let data = { a: 'b', c: 'd' };
|
||||
*
|
||||
* documentRef.set(data).then(() => {
|
||||
* return documentRef.update({a: Firestore.FieldValue.delete()});
|
||||
* }).then(() => {
|
||||
* // Document now only contains { c: 'd' }
|
||||
* });
|
||||
*/
|
||||
static delete(): FieldValue;
|
||||
/**
|
||||
* Returns a sentinel used with set(), create() or update() to include a
|
||||
* server-generated timestamp in the written data.
|
||||
*
|
||||
* @return {FieldValue} The FieldValue sentinel for use in a call to set(),
|
||||
* create() or update().
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({
|
||||
* time: Firestore.FieldValue.serverTimestamp()
|
||||
* }).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(doc => {
|
||||
* console.log(`Server time set to ${doc.get('time')}`);
|
||||
* });
|
||||
*/
|
||||
static serverTimestamp(): FieldValue;
|
||||
/**
|
||||
* Returns a special value that can be used with set(), create() or update()
|
||||
* that tells the server to increment the the field's current value by the
|
||||
* given value.
|
||||
*
|
||||
* If either current field value or the operand uses floating point
|
||||
* precision, both values will be interpreted as floating point numbers and
|
||||
* all arithmetic will follow IEEE 754 semantics. Otherwise, integer
|
||||
* precision is kept and the result is capped between -2^63 and 2^63-1.
|
||||
*
|
||||
* If the current field value is not of type 'number', or if the field does
|
||||
* not yet exist, the transformation will set the field to the given value.
|
||||
*
|
||||
* @param {number} n The value to increment by.
|
||||
* @return {FieldValue} The FieldValue sentinel for use in a call to set(),
|
||||
* create() or update().
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.update(
|
||||
* 'counter', Firestore.FieldValue.increment(1)
|
||||
* ).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(doc => {
|
||||
* // doc.get('counter') was incremented
|
||||
* });
|
||||
*/
|
||||
static increment(n: number): FieldValue;
|
||||
/**
|
||||
* Returns a special value that can be used with set(), create() or update()
|
||||
* that tells the server to union the given elements with any array value that
|
||||
* already exists on the server. Each specified element that doesn't already
|
||||
* exist in the array will be added to the end. If the field being modified is
|
||||
* not already an array it will be overwritten with an array containing
|
||||
* exactly the specified elements.
|
||||
*
|
||||
* @param {...*} elements The elements to union into the array.
|
||||
* @return {FieldValue} The FieldValue sentinel for use in a call to set(),
|
||||
* create() or update().
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.update(
|
||||
* 'array', Firestore.FieldValue.arrayUnion('foo')
|
||||
* ).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(doc => {
|
||||
* // doc.get('array') contains field 'foo'
|
||||
* });
|
||||
*/
|
||||
static arrayUnion(...elements: unknown[]): FieldValue;
|
||||
/**
|
||||
* Returns a special value that can be used with set(), create() or update()
|
||||
* that tells the server to remove the given elements from any array value
|
||||
* that already exists on the server. All instances of each element specified
|
||||
* will be removed from the array. If the field being modified is not already
|
||||
* an array it will be overwritten with an empty array.
|
||||
*
|
||||
* @param {...*} elements The elements to remove from the array.
|
||||
* @return {FieldValue} The FieldValue sentinel for use in a call to set(),
|
||||
* create() or update().
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.update(
|
||||
* 'array', Firestore.FieldValue.arrayRemove('foo')
|
||||
* ).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(doc => {
|
||||
* // doc.get('array') no longer contains field 'foo'
|
||||
* });
|
||||
*/
|
||||
static arrayRemove(...elements: unknown[]): FieldValue;
|
||||
/**
|
||||
* Returns true if this `FieldValue` is equal to the provided value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return {boolean} true if this `FieldValue` is equal to the provided value.
|
||||
*
|
||||
* @example
|
||||
* let fieldValues = [
|
||||
* Firestore.FieldValue.increment(-1.0),
|
||||
* Firestore.FieldValue.increment(-1),
|
||||
* Firestore.FieldValue.increment(-0.0),
|
||||
* Firestore.FieldValue.increment(-0),
|
||||
* Firestore.FieldValue.increment(0),
|
||||
* Firestore.FieldValue.increment(0.0),
|
||||
* Firestore.FieldValue.increment(1),
|
||||
* Firestore.FieldValue.increment(1.0)
|
||||
* ];
|
||||
*
|
||||
* let equal = 0;
|
||||
* for (let i = 0; i < fieldValues.length; ++i) {
|
||||
* for (let j = i + 1; j < fieldValues.length; ++j) {
|
||||
* if (fieldValues[i].isEqual(fieldValues[j])) {
|
||||
* ++equal;
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* console.log(`Found ${equal} equalities.`);
|
||||
*/
|
||||
isEqual(other: firestore.FieldValue): boolean;
|
||||
}
|
||||
/**
|
||||
* An internal interface shared by all field transforms.
|
||||
*
|
||||
* A 'FieldTransform` subclass should implement '.includeInDocumentMask',
|
||||
* '.includeInDocumentTransform' and 'toProto' (if '.includeInDocumentTransform'
|
||||
* is 'true').
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @abstract
|
||||
*/
|
||||
export declare abstract class FieldTransform extends FieldValue {
|
||||
/** Whether this FieldTransform should be included in the document mask. */
|
||||
abstract get includeInDocumentMask(): boolean;
|
||||
/**
|
||||
* Whether this FieldTransform should be included in the list of document
|
||||
* transforms.
|
||||
*/
|
||||
abstract get includeInDocumentTransform(): boolean;
|
||||
/** The method name used to obtain the field transform. */
|
||||
abstract get methodName(): string;
|
||||
/**
|
||||
* Performs input validation on the values of this field transform.
|
||||
*
|
||||
* @param allowUndefined Whether to allow nested properties that are `undefined`.
|
||||
*/
|
||||
abstract validate(allowUndefined: boolean): void;
|
||||
/***
|
||||
* The proto representation for this field transform.
|
||||
*
|
||||
* @param serializer The Firestore serializer.
|
||||
* @param fieldPath The field path to apply this transformation to.
|
||||
* @return The 'FieldTransform' proto message.
|
||||
*/
|
||||
abstract toProto(serializer: Serializer, fieldPath: FieldPath): api.DocumentTransform.IFieldTransform;
|
||||
}
|
||||
/**
|
||||
* A transform that deletes a field from a Firestore document.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class DeleteTransform extends FieldTransform {
|
||||
/**
|
||||
* Sentinel value for a field delete.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
static DELETE_SENTINEL: DeleteTransform;
|
||||
private constructor();
|
||||
/**
|
||||
* Deletes are included in document masks.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentMask(): true;
|
||||
/**
|
||||
* Deletes are are omitted from document transforms.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentTransform(): false;
|
||||
get methodName(): string;
|
||||
validate(): void;
|
||||
toProto(): never;
|
||||
}
|
||||
+454
@@ -0,0 +1,454 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const deepEqual = require("fast-deep-equal");
|
||||
const serializer_1 = require("./serializer");
|
||||
const validate_1 = require("./validate");
|
||||
/**
|
||||
* Sentinel values that can be used when writing documents with set(), create()
|
||||
* or update().
|
||||
*
|
||||
* @class FieldValue
|
||||
*/
|
||||
class FieldValue {
|
||||
/**
|
||||
* @hideconstructor
|
||||
*/
|
||||
constructor() { }
|
||||
/**
|
||||
* Returns a sentinel for use with update() or set() with {merge:true} to mark
|
||||
* a field for deletion.
|
||||
*
|
||||
* @returns {FieldValue} The sentinel value to use in your objects.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* let data = { a: 'b', c: 'd' };
|
||||
*
|
||||
* documentRef.set(data).then(() => {
|
||||
* return documentRef.update({a: Firestore.FieldValue.delete()});
|
||||
* }).then(() => {
|
||||
* // Document now only contains { c: 'd' }
|
||||
* });
|
||||
*/
|
||||
static delete() {
|
||||
return DeleteTransform.DELETE_SENTINEL;
|
||||
}
|
||||
/**
|
||||
* Returns a sentinel used with set(), create() or update() to include a
|
||||
* server-generated timestamp in the written data.
|
||||
*
|
||||
* @return {FieldValue} The FieldValue sentinel for use in a call to set(),
|
||||
* create() or update().
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({
|
||||
* time: Firestore.FieldValue.serverTimestamp()
|
||||
* }).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(doc => {
|
||||
* console.log(`Server time set to ${doc.get('time')}`);
|
||||
* });
|
||||
*/
|
||||
static serverTimestamp() {
|
||||
return ServerTimestampTransform.SERVER_TIMESTAMP_SENTINEL;
|
||||
}
|
||||
/**
|
||||
* Returns a special value that can be used with set(), create() or update()
|
||||
* that tells the server to increment the the field's current value by the
|
||||
* given value.
|
||||
*
|
||||
* If either current field value or the operand uses floating point
|
||||
* precision, both values will be interpreted as floating point numbers and
|
||||
* all arithmetic will follow IEEE 754 semantics. Otherwise, integer
|
||||
* precision is kept and the result is capped between -2^63 and 2^63-1.
|
||||
*
|
||||
* If the current field value is not of type 'number', or if the field does
|
||||
* not yet exist, the transformation will set the field to the given value.
|
||||
*
|
||||
* @param {number} n The value to increment by.
|
||||
* @return {FieldValue} The FieldValue sentinel for use in a call to set(),
|
||||
* create() or update().
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.update(
|
||||
* 'counter', Firestore.FieldValue.increment(1)
|
||||
* ).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(doc => {
|
||||
* // doc.get('counter') was incremented
|
||||
* });
|
||||
*/
|
||||
static increment(n) {
|
||||
// eslint-disable-next-line prefer-rest-params
|
||||
validate_1.validateMinNumberOfArguments('FieldValue.increment', arguments, 1);
|
||||
return new NumericIncrementTransform(n);
|
||||
}
|
||||
/**
|
||||
* Returns a special value that can be used with set(), create() or update()
|
||||
* that tells the server to union the given elements with any array value that
|
||||
* already exists on the server. Each specified element that doesn't already
|
||||
* exist in the array will be added to the end. If the field being modified is
|
||||
* not already an array it will be overwritten with an array containing
|
||||
* exactly the specified elements.
|
||||
*
|
||||
* @param {...*} elements The elements to union into the array.
|
||||
* @return {FieldValue} The FieldValue sentinel for use in a call to set(),
|
||||
* create() or update().
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.update(
|
||||
* 'array', Firestore.FieldValue.arrayUnion('foo')
|
||||
* ).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(doc => {
|
||||
* // doc.get('array') contains field 'foo'
|
||||
* });
|
||||
*/
|
||||
static arrayUnion(...elements) {
|
||||
validate_1.validateMinNumberOfArguments('FieldValue.arrayUnion', elements, 1);
|
||||
return new ArrayUnionTransform(elements);
|
||||
}
|
||||
/**
|
||||
* Returns a special value that can be used with set(), create() or update()
|
||||
* that tells the server to remove the given elements from any array value
|
||||
* that already exists on the server. All instances of each element specified
|
||||
* will be removed from the array. If the field being modified is not already
|
||||
* an array it will be overwritten with an empty array.
|
||||
*
|
||||
* @param {...*} elements The elements to remove from the array.
|
||||
* @return {FieldValue} The FieldValue sentinel for use in a call to set(),
|
||||
* create() or update().
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.update(
|
||||
* 'array', Firestore.FieldValue.arrayRemove('foo')
|
||||
* ).then(() => {
|
||||
* return documentRef.get();
|
||||
* }).then(doc => {
|
||||
* // doc.get('array') no longer contains field 'foo'
|
||||
* });
|
||||
*/
|
||||
static arrayRemove(...elements) {
|
||||
validate_1.validateMinNumberOfArguments('FieldValue.arrayRemove', elements, 1);
|
||||
return new ArrayRemoveTransform(elements);
|
||||
}
|
||||
/**
|
||||
* Returns true if this `FieldValue` is equal to the provided value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return {boolean} true if this `FieldValue` is equal to the provided value.
|
||||
*
|
||||
* @example
|
||||
* let fieldValues = [
|
||||
* Firestore.FieldValue.increment(-1.0),
|
||||
* Firestore.FieldValue.increment(-1),
|
||||
* Firestore.FieldValue.increment(-0.0),
|
||||
* Firestore.FieldValue.increment(-0),
|
||||
* Firestore.FieldValue.increment(0),
|
||||
* Firestore.FieldValue.increment(0.0),
|
||||
* Firestore.FieldValue.increment(1),
|
||||
* Firestore.FieldValue.increment(1.0)
|
||||
* ];
|
||||
*
|
||||
* let equal = 0;
|
||||
* for (let i = 0; i < fieldValues.length; ++i) {
|
||||
* for (let j = i + 1; j < fieldValues.length; ++j) {
|
||||
* if (fieldValues[i].isEqual(fieldValues[j])) {
|
||||
* ++equal;
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* console.log(`Found ${equal} equalities.`);
|
||||
*/
|
||||
isEqual(other) {
|
||||
return this === other;
|
||||
}
|
||||
}
|
||||
exports.FieldValue = FieldValue;
|
||||
/**
|
||||
* An internal interface shared by all field transforms.
|
||||
*
|
||||
* A 'FieldTransform` subclass should implement '.includeInDocumentMask',
|
||||
* '.includeInDocumentTransform' and 'toProto' (if '.includeInDocumentTransform'
|
||||
* is 'true').
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @abstract
|
||||
*/
|
||||
class FieldTransform extends FieldValue {
|
||||
}
|
||||
exports.FieldTransform = FieldTransform;
|
||||
/**
|
||||
* A transform that deletes a field from a Firestore document.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class DeleteTransform extends FieldTransform {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
/**
|
||||
* Deletes are included in document masks.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentMask() {
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Deletes are are omitted from document transforms.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentTransform() {
|
||||
return false;
|
||||
}
|
||||
get methodName() {
|
||||
return 'FieldValue.delete';
|
||||
}
|
||||
validate() { }
|
||||
toProto() {
|
||||
throw new Error('FieldValue.delete() should not be included in a FieldTransform');
|
||||
}
|
||||
}
|
||||
exports.DeleteTransform = DeleteTransform;
|
||||
/**
|
||||
* Sentinel value for a field delete.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
DeleteTransform.DELETE_SENTINEL = new DeleteTransform();
|
||||
/**
|
||||
* A transform that sets a field to the Firestore server time.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class ServerTimestampTransform extends FieldTransform {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
/**
|
||||
* Server timestamps are omitted from document masks.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentMask() {
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Server timestamps are included in document transforms.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentTransform() {
|
||||
return true;
|
||||
}
|
||||
get methodName() {
|
||||
return 'FieldValue.serverTimestamp';
|
||||
}
|
||||
validate() { }
|
||||
toProto(serializer, fieldPath) {
|
||||
return {
|
||||
fieldPath: fieldPath.formattedName,
|
||||
setToServerValue: 'REQUEST_TIME',
|
||||
};
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Sentinel value for a server timestamp.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
ServerTimestampTransform.SERVER_TIMESTAMP_SENTINEL = new ServerTimestampTransform();
|
||||
/**
|
||||
* Increments a field value on the backend.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class NumericIncrementTransform extends FieldTransform {
|
||||
constructor(operand) {
|
||||
super();
|
||||
this.operand = operand;
|
||||
}
|
||||
/**
|
||||
* Numeric transforms are omitted from document masks.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentMask() {
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Numeric transforms are included in document transforms.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentTransform() {
|
||||
return true;
|
||||
}
|
||||
get methodName() {
|
||||
return 'FieldValue.increment';
|
||||
}
|
||||
validate() {
|
||||
validate_1.validateNumber('FieldValue.increment()', this.operand);
|
||||
}
|
||||
toProto(serializer, fieldPath) {
|
||||
const encodedOperand = serializer.encodeValue(this.operand);
|
||||
return { fieldPath: fieldPath.formattedName, increment: encodedOperand };
|
||||
}
|
||||
isEqual(other) {
|
||||
return (this === other ||
|
||||
(other instanceof NumericIncrementTransform &&
|
||||
this.operand === other.operand));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Transforms an array value via a union operation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class ArrayUnionTransform extends FieldTransform {
|
||||
constructor(elements) {
|
||||
super();
|
||||
this.elements = elements;
|
||||
}
|
||||
/**
|
||||
* Array transforms are omitted from document masks.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentMask() {
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Array transforms are included in document transforms.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentTransform() {
|
||||
return true;
|
||||
}
|
||||
get methodName() {
|
||||
return 'FieldValue.arrayUnion';
|
||||
}
|
||||
validate(allowUndefined) {
|
||||
for (let i = 0; i < this.elements.length; ++i) {
|
||||
validateArrayElement(i, this.elements[i], allowUndefined);
|
||||
}
|
||||
}
|
||||
toProto(serializer, fieldPath) {
|
||||
const encodedElements = serializer.encodeValue(this.elements).arrayValue;
|
||||
return {
|
||||
fieldPath: fieldPath.formattedName,
|
||||
appendMissingElements: encodedElements,
|
||||
};
|
||||
}
|
||||
isEqual(other) {
|
||||
return (this === other ||
|
||||
(other instanceof ArrayUnionTransform &&
|
||||
deepEqual(this.elements, other.elements)));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Transforms an array value via a remove operation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class ArrayRemoveTransform extends FieldTransform {
|
||||
constructor(elements) {
|
||||
super();
|
||||
this.elements = elements;
|
||||
}
|
||||
/**
|
||||
* Array transforms are omitted from document masks.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentMask() {
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Array transforms are included in document transforms.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get includeInDocumentTransform() {
|
||||
return true;
|
||||
}
|
||||
get methodName() {
|
||||
return 'FieldValue.arrayRemove';
|
||||
}
|
||||
validate(allowUndefined) {
|
||||
for (let i = 0; i < this.elements.length; ++i) {
|
||||
validateArrayElement(i, this.elements[i], allowUndefined);
|
||||
}
|
||||
}
|
||||
toProto(serializer, fieldPath) {
|
||||
const encodedElements = serializer.encodeValue(this.elements).arrayValue;
|
||||
return {
|
||||
fieldPath: fieldPath.formattedName,
|
||||
removeAllFromArray: encodedElements,
|
||||
};
|
||||
}
|
||||
isEqual(other) {
|
||||
return (this === other ||
|
||||
(other instanceof ArrayRemoveTransform &&
|
||||
deepEqual(this.elements, other.elements)));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Validates that `value` can be used as an element inside of an array. Certain
|
||||
* field values (such as ServerTimestamps) are rejected. Nested arrays are also
|
||||
* rejected.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param value The value to validate.
|
||||
* @param allowUndefined Whether to allow nested properties that are `undefined`.
|
||||
*/
|
||||
function validateArrayElement(arg, value, allowUndefined) {
|
||||
if (Array.isArray(value)) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'array element')} Nested arrays are not supported.`);
|
||||
}
|
||||
serializer_1.validateUserInput(arg, value, 'array element',
|
||||
/*path=*/ { allowDeletes: 'none', allowTransforms: false, allowUndefined },
|
||||
/*path=*/ undefined,
|
||||
/*level=*/ 0,
|
||||
/*inArray=*/ true);
|
||||
}
|
||||
//# sourceMappingURL=field-value.js.map
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { google } from '../protos/firestore_v1_proto_api';
|
||||
import { Serializable } from './serializer';
|
||||
import api = google.firestore.v1;
|
||||
/**
|
||||
* An immutable object representing a geographic location in Firestore. The
|
||||
* location is represented as a latitude/longitude pair.
|
||||
*
|
||||
* @class
|
||||
*/
|
||||
export declare class GeoPoint implements Serializable, firestore.GeoPoint {
|
||||
private readonly _latitude;
|
||||
private readonly _longitude;
|
||||
/**
|
||||
* Creates a [GeoPoint]{@link GeoPoint}.
|
||||
*
|
||||
* @param {number} latitude The latitude as a number between -90 and 90.
|
||||
* @param {number} longitude The longitude as a number between -180 and 180.
|
||||
*
|
||||
* @example
|
||||
* let data = {
|
||||
* google: new Firestore.GeoPoint(37.422, 122.084)
|
||||
* };
|
||||
*
|
||||
* firestore.doc('col/doc').set(data).then(() => {
|
||||
* console.log(`Location is ${data.google.latitude}, ` +
|
||||
* `${data.google.longitude}`);
|
||||
* });
|
||||
*/
|
||||
constructor(latitude: number, longitude: number);
|
||||
/**
|
||||
* The latitude as a number between -90 and 90.
|
||||
*
|
||||
* @type {number}
|
||||
* @name GeoPoint#latitude
|
||||
* @readonly
|
||||
*/
|
||||
get latitude(): number;
|
||||
/**
|
||||
* The longitude as a number between -180 and 180.
|
||||
*
|
||||
* @type {number}
|
||||
* @name GeoPoint#longitude
|
||||
* @readonly
|
||||
*/
|
||||
get longitude(): number;
|
||||
/**
|
||||
* Returns true if this `GeoPoint` is equal to the provided value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return {boolean} true if this `GeoPoint` is equal to the provided value.
|
||||
*/
|
||||
isEqual(other: firestore.GeoPoint): boolean;
|
||||
/**
|
||||
* Converts the GeoPoint to a google.type.LatLng proto.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toProto(): api.IValue;
|
||||
/**
|
||||
* Converts a google.type.LatLng proto to its GeoPoint representation.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
static fromProto(proto: google.type.ILatLng): GeoPoint;
|
||||
}
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const validate_1 = require("./validate");
|
||||
/**
|
||||
* An immutable object representing a geographic location in Firestore. The
|
||||
* location is represented as a latitude/longitude pair.
|
||||
*
|
||||
* @class
|
||||
*/
|
||||
class GeoPoint {
|
||||
/**
|
||||
* Creates a [GeoPoint]{@link GeoPoint}.
|
||||
*
|
||||
* @param {number} latitude The latitude as a number between -90 and 90.
|
||||
* @param {number} longitude The longitude as a number between -180 and 180.
|
||||
*
|
||||
* @example
|
||||
* let data = {
|
||||
* google: new Firestore.GeoPoint(37.422, 122.084)
|
||||
* };
|
||||
*
|
||||
* firestore.doc('col/doc').set(data).then(() => {
|
||||
* console.log(`Location is ${data.google.latitude}, ` +
|
||||
* `${data.google.longitude}`);
|
||||
* });
|
||||
*/
|
||||
constructor(latitude, longitude) {
|
||||
validate_1.validateNumber('latitude', latitude, { minValue: -90, maxValue: 90 });
|
||||
validate_1.validateNumber('longitude', longitude, { minValue: -180, maxValue: 180 });
|
||||
this._latitude = latitude;
|
||||
this._longitude = longitude;
|
||||
}
|
||||
/**
|
||||
* The latitude as a number between -90 and 90.
|
||||
*
|
||||
* @type {number}
|
||||
* @name GeoPoint#latitude
|
||||
* @readonly
|
||||
*/
|
||||
get latitude() {
|
||||
return this._latitude;
|
||||
}
|
||||
/**
|
||||
* The longitude as a number between -180 and 180.
|
||||
*
|
||||
* @type {number}
|
||||
* @name GeoPoint#longitude
|
||||
* @readonly
|
||||
*/
|
||||
get longitude() {
|
||||
return this._longitude;
|
||||
}
|
||||
/**
|
||||
* Returns true if this `GeoPoint` is equal to the provided value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return {boolean} true if this `GeoPoint` is equal to the provided value.
|
||||
*/
|
||||
isEqual(other) {
|
||||
return (this === other ||
|
||||
(other instanceof GeoPoint &&
|
||||
this.latitude === other.latitude &&
|
||||
this.longitude === other.longitude));
|
||||
}
|
||||
/**
|
||||
* Converts the GeoPoint to a google.type.LatLng proto.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toProto() {
|
||||
return {
|
||||
geoPointValue: {
|
||||
latitude: this.latitude,
|
||||
longitude: this.longitude,
|
||||
},
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Converts a google.type.LatLng proto to its GeoPoint representation.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
static fromProto(proto) {
|
||||
return new GeoPoint(proto.latitude || 0, proto.longitude || 0);
|
||||
}
|
||||
}
|
||||
exports.GeoPoint = GeoPoint;
|
||||
//# sourceMappingURL=geo-point.js.map
|
||||
+893
@@ -0,0 +1,893 @@
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
/// <reference types="node" />
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { Duplex } from 'stream';
|
||||
import { google } from '../protos/firestore_v1_proto_api';
|
||||
import { BulkWriter } from './bulk-writer';
|
||||
import { BundleBuilder } from './bundle';
|
||||
import { DocumentSnapshot, QueryDocumentSnapshot } from './document';
|
||||
import { CollectionReference, DocumentReference } from './reference';
|
||||
import { Serializer } from './serializer';
|
||||
import { Transaction } from './transaction';
|
||||
import { FirestoreStreamingMethod, FirestoreUnaryMethod } from './types';
|
||||
import { WriteBatch } from './write-batch';
|
||||
import api = google.firestore.v1;
|
||||
import { CollectionGroup } from './collection-group';
|
||||
export { CollectionReference, DocumentReference, QuerySnapshot, Query, } from './reference';
|
||||
export { BulkWriter } from './bulk-writer';
|
||||
export { DocumentSnapshot, QueryDocumentSnapshot } from './document';
|
||||
export { FieldValue } from './field-value';
|
||||
export { WriteBatch, WriteResult } from './write-batch';
|
||||
export { Transaction } from './transaction';
|
||||
export { Timestamp } from './timestamp';
|
||||
export { DocumentChange } from './document-change';
|
||||
export { FieldPath } from './path';
|
||||
export { GeoPoint } from './geo-point';
|
||||
export { CollectionGroup };
|
||||
export { QueryPartition } from './query-partition';
|
||||
export { setLogFunction } from './logger';
|
||||
/*!
|
||||
* The maximum number of times to retry idempotent requests.
|
||||
*/
|
||||
export declare const MAX_REQUEST_RETRIES = 5;
|
||||
/*!
|
||||
* The maximum number of times to attempt a transaction before failing.
|
||||
*/
|
||||
export declare const DEFAULT_MAX_TRANSACTION_ATTEMPTS = 5;
|
||||
/**
|
||||
* Document data (e.g. for use with
|
||||
* [set()]{@link DocumentReference#set}) consisting of fields mapped
|
||||
* to values.
|
||||
*
|
||||
* @typedef {Object.<string, *>} DocumentData
|
||||
*/
|
||||
/**
|
||||
* Converter used by [withConverter()]{@link Query#withConverter} to transform
|
||||
* user objects of type T into Firestore data.
|
||||
*
|
||||
* Using the converter allows you to specify generic type arguments when storing
|
||||
* and retrieving objects from Firestore.
|
||||
*
|
||||
* @example
|
||||
* class Post {
|
||||
* constructor(readonly title: string, readonly author: string) {}
|
||||
*
|
||||
* toString(): string {
|
||||
* return this.title + ', by ' + this.author;
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* const postConverter = {
|
||||
* toFirestore(post: Post): FirebaseFirestore.DocumentData {
|
||||
* return {title: post.title, author: post.author};
|
||||
* },
|
||||
* fromFirestore(
|
||||
* data: FirebaseFirestore.QueryDocumentSnapshot
|
||||
* ): Post {
|
||||
* const data = snapshot.data();
|
||||
* return new Post(data.title, data.author);
|
||||
* }
|
||||
* };
|
||||
*
|
||||
* const postSnap = await Firestore()
|
||||
* .collection('posts')
|
||||
* .withConverter(postConverter)
|
||||
* .doc().get();
|
||||
* const post = postSnap.data();
|
||||
* if (post !== undefined) {
|
||||
* post.title; // string
|
||||
* post.toString(); // Should be defined
|
||||
* post.someNonExistentProperty; // TS error
|
||||
* }
|
||||
*
|
||||
* @property {Function} toFirestore Called by the Firestore SDK to convert a
|
||||
* custom model object of type T into a plain Javascript object (suitable for
|
||||
* writing directly to the Firestore database).
|
||||
* @property {Function} fromFirestore Called by the Firestore SDK to convert
|
||||
* Firestore data into an object of type T.
|
||||
* @typedef {Object} FirestoreDataConverter
|
||||
*/
|
||||
/**
|
||||
* Update data (for use with [update]{@link DocumentReference#update})
|
||||
* that contains paths mapped to values. Fields that contain dots
|
||||
* reference nested fields within the document.
|
||||
*
|
||||
* You can update a top-level field in your document by using the field name
|
||||
* as a key (e.g. `foo`). The provided value completely replaces the contents
|
||||
* for this field.
|
||||
*
|
||||
* You can also update a nested field directly by using its field path as a key
|
||||
* (e.g. `foo.bar`). This nested field update replaces the contents at `bar`
|
||||
* but does not modify other data under `foo`.
|
||||
*
|
||||
* @example
|
||||
* const documentRef = firestore.doc('coll/doc');
|
||||
* documentRef.set({a1: {a2: 'val'}, b1: {b2: 'val'}, c1: {c2: 'val'}});
|
||||
* documentRef.update({
|
||||
* b1: {b3: 'val'},
|
||||
* 'c1.c3': 'val',
|
||||
* });
|
||||
* // Value is {a1: {a2: 'val'}, b1: {b3: 'val'}, c1: {c2: 'val', c3: 'val'}}
|
||||
*
|
||||
* @typedef {Object.<string, *>} UpdateData
|
||||
*/
|
||||
/**
|
||||
* An options object that configures conditional behavior of
|
||||
* [update()]{@link DocumentReference#update} and
|
||||
* [delete()]{@link DocumentReference#delete} calls in
|
||||
* [DocumentReference]{@link DocumentReference},
|
||||
* [WriteBatch]{@link WriteBatch}, [BulkWriter]{@link BulkWriter}, and
|
||||
* [Transaction]{@link Transaction}. Using Preconditions, these calls
|
||||
* can be restricted to only apply to documents that match the specified
|
||||
* conditions.
|
||||
*
|
||||
* @example
|
||||
* const documentRef = firestore.doc('coll/doc');
|
||||
*
|
||||
* documentRef.get().then(snapshot => {
|
||||
* const updateTime = snapshot.updateTime;
|
||||
*
|
||||
* console.log(`Deleting document at update time: ${updateTime.toDate()}`);
|
||||
* return documentRef.delete({ lastUpdateTime: updateTime });
|
||||
* });
|
||||
*
|
||||
* @property {Timestamp} lastUpdateTime The update time to enforce. If set,
|
||||
* enforces that the document was last updated at lastUpdateTime. Fails the
|
||||
* operation if the document was last updated at a different time.
|
||||
* @property {boolean} exists If set, enforces that the target document must
|
||||
* or must not exist.
|
||||
* @typedef {Object} Precondition
|
||||
*/
|
||||
/**
|
||||
* An options object that configures the behavior of
|
||||
* [set()]{@link DocumentReference#set} calls in
|
||||
* [DocumentReference]{@link DocumentReference},
|
||||
* [WriteBatch]{@link WriteBatch}, and
|
||||
* [Transaction]{@link Transaction}. These calls can be
|
||||
* configured to perform granular merges instead of overwriting the target
|
||||
* documents in their entirety by providing a SetOptions object with
|
||||
* { merge : true }.
|
||||
*
|
||||
* @property {boolean} merge Changes the behavior of a set() call to only
|
||||
* replace the values specified in its data argument. Fields omitted from the
|
||||
* set() call remain untouched.
|
||||
* @property {Array<(string|FieldPath)>} mergeFields Changes the behavior of
|
||||
* set() calls to only replace the specified field paths. Any field path that is
|
||||
* not specified is ignored and remains untouched.
|
||||
* It is an error to pass a SetOptions object to a set() call that is missing a
|
||||
* value for any of the fields specified here.
|
||||
* @typedef {Object} SetOptions
|
||||
*/
|
||||
/**
|
||||
* An options object that can be used to configure the behavior of
|
||||
* [getAll()]{@link Firestore#getAll} calls. By providing a `fieldMask`, these
|
||||
* calls can be configured to only return a subset of fields.
|
||||
*
|
||||
* @property {Array<(string|FieldPath)>} fieldMask Specifies the set of fields
|
||||
* to return and reduces the amount of data transmitted by the backend.
|
||||
* Adding a field mask does not filter results. Documents do not need to
|
||||
* contain values for all the fields in the mask to be part of the result set.
|
||||
* @typedef {Object} ReadOptions
|
||||
*/
|
||||
/**
|
||||
* An options object to configure throttling on BulkWriter.
|
||||
*
|
||||
* Whether to disable or configure throttling. By default, throttling is
|
||||
* enabled. `throttling` can be set to either a boolean or a config object.
|
||||
* Setting it to `true` will use default values. You can override the defaults
|
||||
* by setting it to `false` to disable throttling, or by setting the config
|
||||
* values to enable throttling with the provided values.
|
||||
*
|
||||
* @property {boolean|Object} throttling Whether to disable or enable
|
||||
* throttling. Throttling is enabled by default, if the field is set to `true`
|
||||
* or if any custom throttling options are provided. `{ initialOpsPerSecond:
|
||||
* number }` sets the initial maximum number of operations per second allowed by
|
||||
* the throttler. If `initialOpsPerSecond` is not set, the default is 500
|
||||
* operations per second. `{ maxOpsPerSecond: number }` sets the maximum number
|
||||
* of operations per second allowed by the throttler. If `maxOpsPerSecond` is
|
||||
* not set, no maximum is enforced.
|
||||
* @typedef {Object} BulkWriterOptions
|
||||
*/
|
||||
/**
|
||||
* An error thrown when a BulkWriter operation fails.
|
||||
*
|
||||
* The error used by {@link BulkWriter~shouldRetryCallback} set in
|
||||
* {@link BulkWriter#onWriteError}.
|
||||
*
|
||||
* @property {GrpcStatus} code The status code of the error.
|
||||
* @property {string} message The error message of the error.
|
||||
* @property {DocumentReference} documentRef The document reference the operation was
|
||||
* performed on.
|
||||
* @property {'create' | 'set' | 'update' | 'delete'} operationType The type
|
||||
* of operation performed.
|
||||
* @property {number} failedAttempts How many times this operation has been
|
||||
* attempted unsuccessfully.
|
||||
* @typedef {Error} BulkWriterError
|
||||
*/
|
||||
/**
|
||||
* Status codes returned by GRPC operations.
|
||||
*
|
||||
* @see https://github.com/grpc/grpc/blob/master/doc/statuscodes.md
|
||||
*
|
||||
* @enum {number}
|
||||
* @typedef {Object} GrpcStatus
|
||||
*/
|
||||
/**
|
||||
* The Firestore client represents a Firestore Database and is the entry point
|
||||
* for all Firestore operations.
|
||||
*
|
||||
* @see [Firestore Documentation]{@link https://firebase.google.com/docs/firestore/}
|
||||
*
|
||||
* @class
|
||||
*
|
||||
* @example <caption>Install the client library with <a
|
||||
* href="https://www.npmjs.com/">npm</a>:</caption> npm install --save
|
||||
* @google-cloud/firestore
|
||||
*
|
||||
* @example <caption>Import the client library</caption>
|
||||
* var Firestore = require('@google-cloud/firestore');
|
||||
*
|
||||
* @example <caption>Create a client that uses <a
|
||||
* href="https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application">Application
|
||||
* Default Credentials (ADC)</a>:</caption> var firestore = new Firestore();
|
||||
*
|
||||
* @example <caption>Create a client with <a
|
||||
* href="https://cloud.google.com/docs/authentication/production#obtaining_and_providing_service_account_credentials_manually">explicit
|
||||
* credentials</a>:</caption> var firestore = new Firestore({ projectId:
|
||||
* 'your-project-id', keyFilename: '/path/to/keyfile.json'
|
||||
* });
|
||||
*
|
||||
* @example <caption>include:samples/quickstart.js</caption>
|
||||
* region_tag:firestore_quickstart
|
||||
* Full quickstart example:
|
||||
*/
|
||||
export declare class Firestore implements firestore.Firestore {
|
||||
/**
|
||||
* A client pool to distribute requests over multiple GAPIC clients in order
|
||||
* to work around a connection limit of 100 concurrent requests per client.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _clientPool;
|
||||
/**
|
||||
* The configuration options for the GAPIC client.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_settings: firestore.Settings;
|
||||
/**
|
||||
* Settings for the exponential backoff used by the streaming endpoints.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _backoffSettings;
|
||||
/**
|
||||
* Whether the initialization settings can still be changed by invoking
|
||||
* `settings()`.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _settingsFrozen;
|
||||
/**
|
||||
* The serializer to use for the Protobuf transformation.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_serializer: Serializer | null;
|
||||
/**
|
||||
* The project ID for this client.
|
||||
*
|
||||
* The project ID is auto-detected during the first request unless a project
|
||||
* ID is passed to the constructor (or provided via `.settings()`).
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _projectId;
|
||||
/**
|
||||
* Count of listeners that have been registered on the client.
|
||||
*
|
||||
* The client can only be terminated when there are no pending writes or
|
||||
* registered listeners.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private registeredListenersCount;
|
||||
/**
|
||||
* A lazy-loaded BulkWriter instance to be used with recursiveDelete() if no
|
||||
* BulkWriter instance is provided.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private _bulkWriter;
|
||||
/**
|
||||
* Lazy-load the Firestore's default BulkWriter.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private getBulkWriter;
|
||||
/**
|
||||
* Number of pending operations on the client.
|
||||
*
|
||||
* The client can only be terminated when there are no pending writes or
|
||||
* registered listeners.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private bulkWritersCount;
|
||||
/**
|
||||
* @param {Object=} settings [Configuration object](#/docs).
|
||||
* @param {string=} settings.projectId The project ID from the Google
|
||||
* Developer's Console, e.g. 'grape-spaceship-123'. We will also check the
|
||||
* environment variable GCLOUD_PROJECT for your project ID. Can be omitted in
|
||||
* environments that support
|
||||
* {@link https://cloud.google.com/docs/authentication Application Default
|
||||
* Credentials}
|
||||
* @param {string=} settings.keyFilename Local file containing the Service
|
||||
* Account credentials as downloaded from the Google Developers Console. Can
|
||||
* be omitted in environments that support
|
||||
* {@link https://cloud.google.com/docs/authentication Application Default
|
||||
* Credentials}. To configure Firestore with custom credentials, use
|
||||
* `settings.credentials` and provide the `client_email` and `private_key` of
|
||||
* your service account.
|
||||
* @param {{client_email:string=, private_key:string=}=} settings.credentials
|
||||
* The `client_email` and `private_key` properties of the service account
|
||||
* to use with your Firestore project. Can be omitted in environments that
|
||||
* support {@link https://cloud.google.com/docs/authentication Application
|
||||
* Default Credentials}. If your credentials are stored in a JSON file, you
|
||||
* can specify a `keyFilename` instead.
|
||||
* @param {string=} settings.host The host to connect to.
|
||||
* @param {boolean=} settings.ssl Whether to use SSL when connecting.
|
||||
* @param {number=} settings.maxIdleChannels The maximum number of idle GRPC
|
||||
* channels to keep. A smaller number of idle channels reduces memory usage
|
||||
* but increases request latency for clients with fluctuating request rates.
|
||||
* If set to 0, shuts down all GRPC channels when the client becomes idle.
|
||||
* Defaults to 1.
|
||||
* @param {boolean=} settings.ignoreUndefinedProperties Whether to skip nested
|
||||
* properties that are set to `undefined` during object serialization. If set
|
||||
* to `true`, these properties are skipped and not written to Firestore. If
|
||||
* set `false` or omitted, the SDK throws an exception when it encounters
|
||||
* properties of type `undefined`.
|
||||
*/
|
||||
constructor(settings?: firestore.Settings);
|
||||
/**
|
||||
* Specifies custom settings to be used to configure the `Firestore`
|
||||
* instance. Can only be invoked once and before any other Firestore method.
|
||||
*
|
||||
* If settings are provided via both `settings()` and the `Firestore`
|
||||
* constructor, both settings objects are merged and any settings provided via
|
||||
* `settings()` take precedence.
|
||||
*
|
||||
* @param {object} settings The settings to use for all Firestore operations.
|
||||
*/
|
||||
settings(settings: firestore.Settings): void;
|
||||
private validateAndApplySettings;
|
||||
/**
|
||||
* Returns the Project ID for this Firestore instance. Validates that
|
||||
* `initializeIfNeeded()` was called before.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get projectId(): string;
|
||||
/**
|
||||
* Returns the root path of the database. Validates that
|
||||
* `initializeIfNeeded()` was called before.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get formattedName(): string;
|
||||
/**
|
||||
* Gets a [DocumentReference]{@link DocumentReference} instance that
|
||||
* refers to the document at the specified path.
|
||||
*
|
||||
* @param {string} documentPath A slash-separated path to a document.
|
||||
* @returns {DocumentReference} The
|
||||
* [DocumentReference]{@link DocumentReference} instance.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('collection/document');
|
||||
* console.log(`Path of document is ${documentRef.path}`);
|
||||
*/
|
||||
doc(documentPath: string): DocumentReference;
|
||||
/**
|
||||
* Gets a [CollectionReference]{@link CollectionReference} instance
|
||||
* that refers to the collection at the specified path.
|
||||
*
|
||||
* @param {string} collectionPath A slash-separated path to a collection.
|
||||
* @returns {CollectionReference} The
|
||||
* [CollectionReference]{@link CollectionReference} instance.
|
||||
*
|
||||
* @example
|
||||
* let collectionRef = firestore.collection('collection');
|
||||
*
|
||||
* // Add a document with an auto-generated ID.
|
||||
* collectionRef.add({foo: 'bar'}).then((documentRef) => {
|
||||
* console.log(`Added document at ${documentRef.path})`);
|
||||
* });
|
||||
*/
|
||||
collection(collectionPath: string): CollectionReference;
|
||||
/**
|
||||
* Creates and returns a new Query that includes all documents in the
|
||||
* database that are contained in a collection or subcollection with the
|
||||
* given collectionId.
|
||||
*
|
||||
* @param {string} collectionId Identifies the collections to query over.
|
||||
* Every collection or subcollection with this ID as the last segment of its
|
||||
* path will be included. Cannot contain a slash.
|
||||
* @returns {CollectionGroup} The created CollectionGroup.
|
||||
*
|
||||
* @example
|
||||
* let docA = firestore.doc('mygroup/docA').set({foo: 'bar'});
|
||||
* let docB = firestore.doc('abc/def/mygroup/docB').set({foo: 'bar'});
|
||||
*
|
||||
* Promise.all([docA, docB]).then(() => {
|
||||
* let query = firestore.collectionGroup('mygroup');
|
||||
* query = query.where('foo', '==', 'bar');
|
||||
* return query.get().then(snapshot => {
|
||||
* console.log(`Found ${snapshot.size} documents.`);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
collectionGroup(collectionId: string): CollectionGroup;
|
||||
/**
|
||||
* Creates a [WriteBatch]{@link WriteBatch}, used for performing
|
||||
* multiple writes as a single atomic operation.
|
||||
*
|
||||
* @returns {WriteBatch} A WriteBatch that operates on this Firestore
|
||||
* client.
|
||||
*
|
||||
* @example
|
||||
* let writeBatch = firestore.batch();
|
||||
*
|
||||
* // Add two documents in an atomic batch.
|
||||
* let data = { foo: 'bar' };
|
||||
* writeBatch.set(firestore.doc('col/doc1'), data);
|
||||
* writeBatch.set(firestore.doc('col/doc2'), data);
|
||||
*
|
||||
* writeBatch.commit().then(res => {
|
||||
* console.log('Successfully executed batch.');
|
||||
* });
|
||||
*/
|
||||
batch(): WriteBatch;
|
||||
/**
|
||||
* Creates a [BulkWriter]{@link BulkWriter}, used for performing
|
||||
* multiple writes in parallel. Gradually ramps up writes as specified
|
||||
* by the 500/50/5 rule.
|
||||
*
|
||||
* If you pass [BulkWriterOptions]{@link BulkWriterOptions}, you can
|
||||
* configure the throttling rates for the created BulkWriter.
|
||||
*
|
||||
* @see [500/50/5 Documentation]{@link https://firebase.google.com/docs/firestore/best-practices#ramping_up_traffic}
|
||||
*
|
||||
* @param {BulkWriterOptions=} options BulkWriter options.
|
||||
* @returns {BulkWriter} A BulkWriter that operates on this Firestore
|
||||
* client.
|
||||
*
|
||||
* @example
|
||||
* let bulkWriter = firestore.bulkWriter();
|
||||
*
|
||||
* bulkWriter.create(firestore.doc('col/doc1'), {foo: 'bar'})
|
||||
* .then(res => {
|
||||
* console.log(`Added document at ${res.writeTime}`);
|
||||
* });
|
||||
* bulkWriter.update(firestore.doc('col/doc2'), {foo: 'bar'})
|
||||
* .then(res => {
|
||||
* console.log(`Updated document at ${res.writeTime}`);
|
||||
* });
|
||||
* bulkWriter.delete(firestore.doc('col/doc3'))
|
||||
* .then(res => {
|
||||
* console.log(`Deleted document at ${res.writeTime}`);
|
||||
* });
|
||||
* await bulkWriter.close().then(() => {
|
||||
* console.log('Executed all writes');
|
||||
* });
|
||||
*/
|
||||
bulkWriter(options?: firestore.BulkWriterOptions): BulkWriter;
|
||||
/**
|
||||
* Creates a [DocumentSnapshot]{@link DocumentSnapshot} or a
|
||||
* [QueryDocumentSnapshot]{@link QueryDocumentSnapshot} from a
|
||||
* `firestore.v1.Document` proto (or from a resource name for missing
|
||||
* documents).
|
||||
*
|
||||
* This API is used by Google Cloud Functions and can be called with both
|
||||
* 'Proto3 JSON' and 'Protobuf JS' encoded data.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param documentOrName The Firestore 'Document' proto or the resource name
|
||||
* of a missing document.
|
||||
* @param readTime A 'Timestamp' proto indicating the time this document was
|
||||
* read.
|
||||
* @param encoding One of 'json' or 'protobufJS'. Applies to both the
|
||||
* 'document' Proto and 'readTime'. Defaults to 'protobufJS'.
|
||||
* @returns A QueryDocumentSnapshot for existing documents, otherwise a
|
||||
* DocumentSnapshot.
|
||||
*/
|
||||
snapshot_(documentName: string, readTime?: google.protobuf.ITimestamp, encoding?: 'protobufJS'): DocumentSnapshot;
|
||||
snapshot_(documentName: string, readTime: string, encoding: 'json'): DocumentSnapshot;
|
||||
snapshot_(document: api.IDocument, readTime: google.protobuf.ITimestamp, encoding?: 'protobufJS'): QueryDocumentSnapshot;
|
||||
snapshot_(document: {
|
||||
[k: string]: unknown;
|
||||
}, readTime: string, encoding: 'json'): QueryDocumentSnapshot;
|
||||
/**
|
||||
* Creates a new `BundleBuilder` instance to package selected Firestore data into
|
||||
* a bundle.
|
||||
*
|
||||
* @param bundleId. The id of the bundle. When loaded on clients, client SDKs use this id
|
||||
* and the timestamp associated with the built bundle to tell if it has been loaded already.
|
||||
* If not specified, a random identifier will be used.
|
||||
*/
|
||||
bundle(name?: string): BundleBuilder;
|
||||
/**
|
||||
* Function executed by {@link Firestore#runTransaction} within the transaction
|
||||
* context.
|
||||
*
|
||||
* @callback Firestore~updateFunction
|
||||
* @template T
|
||||
* @param {Transaction} transaction The transaction object for this
|
||||
* transaction.
|
||||
* @returns {Promise<T>} The promise returned at the end of the transaction.
|
||||
* This promise will be returned by {@link Firestore#runTransaction} if the
|
||||
* transaction completed successfully.
|
||||
*/
|
||||
/**
|
||||
* Options object for {@link Firestore#runTransaction} to configure a
|
||||
* read-only transaction.
|
||||
*
|
||||
* @callback Firestore~ReadOnlyTransactionOptions
|
||||
* @template T
|
||||
* @param {true} readOnly Set to true to indicate a read-only transaction.
|
||||
* @param {Timestamp=} readTime If specified, documents are read at the given
|
||||
* time. This may not be more than 60 seconds in the past from when the
|
||||
* request is processed by the server.
|
||||
*/
|
||||
/**
|
||||
* Options object for {@link Firestore#runTransaction} to configure a
|
||||
* read-write transaction.
|
||||
*
|
||||
* @callback Firestore~ReadWriteTransactionOptions
|
||||
* @template T
|
||||
* @param {false=} readOnly Set to false or omit to indicate a read-write
|
||||
* transaction.
|
||||
* @param {number=} maxAttempts The maximum number of attempts for this
|
||||
* transaction. Defaults to five.
|
||||
*/
|
||||
/**
|
||||
* Executes the given updateFunction and commits the changes applied within
|
||||
* the transaction.
|
||||
*
|
||||
* You can use the transaction object passed to 'updateFunction' to read and
|
||||
* modify Firestore documents under lock. You have to perform all reads before
|
||||
* before you perform any write.
|
||||
*
|
||||
* Transactions can be performed as read-only or read-write transactions. By
|
||||
* default, transactions are executed in read-write mode.
|
||||
*
|
||||
* A read-write transaction obtains a pessimistic lock on all documents that
|
||||
* are read during the transaction. These locks block other transactions,
|
||||
* batched writes, and other non-transactional writes from changing that
|
||||
* document. Any writes in a read-write transactions are committed once
|
||||
* 'updateFunction' resolves, which also releases all locks.
|
||||
*
|
||||
* If a read-write transaction fails with contention, the transaction is
|
||||
* retried up to five times. The `updateFunction` is invoked once for each
|
||||
* attempt.
|
||||
*
|
||||
* Read-only transactions do not lock documents. They can be used to read
|
||||
* documents at a consistent snapshot in time, which may be up to 60 seconds
|
||||
* in the past. Read-only transactions are not retried.
|
||||
*
|
||||
* Transactions time out after 60 seconds if no documents are read.
|
||||
* Transactions that are not committed within than 270 seconds are also
|
||||
* aborted. Any remaining locks are released when a transaction times out.
|
||||
*
|
||||
* @template T
|
||||
* @param {Firestore~updateFunction} updateFunction The user function to
|
||||
* execute within the transaction context.
|
||||
* @param {
|
||||
* Firestore~ReadWriteTransactionOptions|Firestore~ReadOnlyTransactionOptions=
|
||||
* } transactionOptions Transaction options.
|
||||
* @returns {Promise<T>} If the transaction completed successfully or was
|
||||
* explicitly aborted (by the updateFunction returning a failed Promise), the
|
||||
* Promise returned by the updateFunction will be returned here. Else if the
|
||||
* transaction failed, a rejected Promise with the corresponding failure
|
||||
* error will be returned.
|
||||
*
|
||||
* @example
|
||||
* let counterTransaction = firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* return transaction.get(documentRef).then(doc => {
|
||||
* if (doc.exists) {
|
||||
* let count = doc.get('count') || 0;
|
||||
* if (count > 10) {
|
||||
* return Promise.reject('Reached maximum count');
|
||||
* }
|
||||
* transaction.update(documentRef, { count: ++count });
|
||||
* return Promise.resolve(count);
|
||||
* }
|
||||
*
|
||||
* transaction.create(documentRef, { count: 1 });
|
||||
* return Promise.resolve(1);
|
||||
* });
|
||||
* });
|
||||
*
|
||||
* counterTransaction.then(res => {
|
||||
* console.log(`Count updated to ${res}`);
|
||||
* });
|
||||
*/
|
||||
runTransaction<T>(updateFunction: (transaction: Transaction) => Promise<T>, transactionOptions?: firestore.ReadWriteTransactionOptions | firestore.ReadOnlyTransactionOptions): Promise<T>;
|
||||
/**
|
||||
* Fetches the root collections that are associated with this Firestore
|
||||
* database.
|
||||
*
|
||||
* @returns {Promise.<Array.<CollectionReference>>} A Promise that resolves
|
||||
* with an array of CollectionReferences.
|
||||
*
|
||||
* @example
|
||||
* firestore.listCollections().then(collections => {
|
||||
* for (let collection of collections) {
|
||||
* console.log(`Found collection with id: ${collection.id}`);
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
listCollections(): Promise<CollectionReference[]>;
|
||||
/**
|
||||
* Retrieves multiple documents from Firestore.
|
||||
*
|
||||
* The first argument is required and must be of type `DocumentReference`
|
||||
* followed by any additional `DocumentReference` documents. If used, the
|
||||
* optional `ReadOptions` must be the last argument.
|
||||
*
|
||||
* @param {...DocumentReference|ReadOptions} documentRefsOrReadOptions The
|
||||
* `DocumentReferences` to receive, followed by an optional field mask.
|
||||
* @returns {Promise<Array.<DocumentSnapshot>>} A Promise that
|
||||
* contains an array with the resulting document snapshots.
|
||||
*
|
||||
* @example
|
||||
* let docRef1 = firestore.doc('col/doc1');
|
||||
* let docRef2 = firestore.doc('col/doc2');
|
||||
*
|
||||
* firestore.getAll(docRef1, docRef2, { fieldMask: ['user'] }).then(docs => {
|
||||
* console.log(`First document: ${JSON.stringify(docs[0])}`);
|
||||
* console.log(`Second document: ${JSON.stringify(docs[1])}`);
|
||||
* });
|
||||
*/
|
||||
getAll<T>(...documentRefsOrReadOptions: Array<firestore.DocumentReference<T> | firestore.ReadOptions>): Promise<Array<DocumentSnapshot<T>>>;
|
||||
/**
|
||||
* Registers a listener on this client, incrementing the listener count. This
|
||||
* is used to verify that all listeners are unsubscribed when terminate() is
|
||||
* called.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
registerListener(): void;
|
||||
/**
|
||||
* Unregisters a listener on this client, decrementing the listener count.
|
||||
* This is used to verify that all listeners are unsubscribed when terminate()
|
||||
* is called.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
unregisterListener(): void;
|
||||
/**
|
||||
* Increments the number of open BulkWriter instances. This is used to verify
|
||||
* that all pending operations are complete when terminate() is called.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_incrementBulkWritersCount(): void;
|
||||
/**
|
||||
* Decrements the number of open BulkWriter instances. This is used to verify
|
||||
* that all pending operations are complete when terminate() is called.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_decrementBulkWritersCount(): void;
|
||||
/**
|
||||
* Recursively deletes all documents and subcollections at and under the
|
||||
* specified level.
|
||||
*
|
||||
* If any delete fails, the promise is rejected with an error message
|
||||
* containing the number of failed deletes and the stack trace of the last
|
||||
* failed delete. The provided reference is deleted regardless of whether
|
||||
* all deletes succeeded.
|
||||
*
|
||||
* `recursiveDelete()` uses a BulkWriter instance with default settings to
|
||||
* perform the deletes. To customize throttling rates or add success/error
|
||||
* callbacks, pass in a custom BulkWriter instance.
|
||||
*
|
||||
* @param ref The reference of a document or collection to delete.
|
||||
* @param bulkWriter A custom BulkWriter instance used to perform the
|
||||
* deletes.
|
||||
* @return A promise that resolves when all deletes have been performed.
|
||||
* The promise is rejected if any of the deletes fail.
|
||||
*
|
||||
* @example
|
||||
* // Recursively delete a reference and log the references of failures.
|
||||
* const bulkWriter = firestore.bulkWriter();
|
||||
* bulkWriter
|
||||
* .onWriteError((error) => {
|
||||
* if (
|
||||
* error.failedAttempts < MAX_RETRY_ATTEMPTS
|
||||
* ) {
|
||||
* return true;
|
||||
* } else {
|
||||
* console.log('Failed write at document: ', error.documentRef.path);
|
||||
* return false;
|
||||
* }
|
||||
* });
|
||||
* await firestore.recursiveDelete(docRef, bulkWriter);
|
||||
*/
|
||||
recursiveDelete(ref: firestore.CollectionReference<unknown> | firestore.DocumentReference<unknown>, bulkWriter?: BulkWriter): Promise<void>;
|
||||
/**
|
||||
* This overload is not private in order to test the query resumption with
|
||||
* startAfter() once the RecursiveDelete instance has MAX_PENDING_OPS pending.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
_recursiveDelete(ref: firestore.CollectionReference<unknown> | firestore.DocumentReference<unknown>, maxPendingOps: number, minPendingOps: number, bulkWriter?: BulkWriter): Promise<void>;
|
||||
/**
|
||||
* Terminates the Firestore client and closes all open streams.
|
||||
*
|
||||
* @return A Promise that resolves when the client is terminated.
|
||||
*/
|
||||
terminate(): Promise<void>;
|
||||
/**
|
||||
* Returns the Project ID to serve as the JSON representation of this
|
||||
* Firestore instance.
|
||||
*
|
||||
* @return An object that contains the project ID (or `undefined` if not yet
|
||||
* available).
|
||||
*/
|
||||
toJSON(): object;
|
||||
/**
|
||||
* Initializes the client if it is not already initialized. All methods in the
|
||||
* SDK can be used after this method completes.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param requestTag A unique client-assigned identifier that caused this
|
||||
* initialization.
|
||||
* @return A Promise that resolves when the client is initialized.
|
||||
*/
|
||||
initializeIfNeeded(requestTag: string): Promise<void>;
|
||||
/**
|
||||
* Returns GAX call options that set the cloud resource header.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private createCallOptions;
|
||||
/**
|
||||
* A function returning a Promise that can be retried.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @callback retryFunction
|
||||
* @returns {Promise} A Promise indicating the function's success.
|
||||
*/
|
||||
/**
|
||||
* Helper method that retries failed Promises.
|
||||
*
|
||||
* If 'delayMs' is specified, waits 'delayMs' between invocations. Otherwise,
|
||||
* schedules the first attempt immediately, and then waits 100 milliseconds
|
||||
* for further attempts.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param methodName Name of the Veneer API endpoint that takes a request
|
||||
* and GAX options.
|
||||
* @param requestTag A unique client-assigned identifier for this request.
|
||||
* @param func Method returning a Promise than can be retried.
|
||||
* @returns A Promise with the function's result if successful within
|
||||
* `attemptsRemaining`. Otherwise, returns the last rejected Promise.
|
||||
*/
|
||||
private _retry;
|
||||
/**
|
||||
* Waits for the provided stream to become active and returns a paused but
|
||||
* healthy stream. If an error occurs before the first byte is read, the
|
||||
* method rejects the returned Promise.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param backendStream The Node stream to monitor.
|
||||
* @param lifetime A Promise that resolves when the stream receives an 'end',
|
||||
* 'close' or 'finish' message.
|
||||
* @param requestTag A unique client-assigned identifier for this request.
|
||||
* @param request If specified, the request that should be written to the
|
||||
* stream after opening.
|
||||
* @returns A guaranteed healthy stream that should be used instead of
|
||||
* `backendStream`.
|
||||
*/
|
||||
private _initializeStream;
|
||||
/**
|
||||
* A funnel for all non-streaming API requests, assigning a project ID where
|
||||
* necessary within the request options.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param methodName Name of the Veneer API endpoint that takes a request
|
||||
* and GAX options.
|
||||
* @param request The Protobuf request to send.
|
||||
* @param requestTag A unique client-assigned identifier for this request.
|
||||
* @param retryCodes If provided, a custom list of retry codes. If not
|
||||
* provided, retry is based on the behavior as defined in the ServiceConfig.
|
||||
* @returns A Promise with the request result.
|
||||
*/
|
||||
request<Req, Resp>(methodName: FirestoreUnaryMethod, request: Req, requestTag: string, retryCodes?: number[]): Promise<Resp>;
|
||||
/**
|
||||
* A funnel for streaming API requests, assigning a project ID where necessary
|
||||
* within the request options.
|
||||
*
|
||||
* The stream is returned in paused state and needs to be resumed once all
|
||||
* listeners are attached.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param methodName Name of the streaming Veneer API endpoint that
|
||||
* takes a request and GAX options.
|
||||
* @param request The Protobuf request to send.
|
||||
* @param requestTag A unique client-assigned identifier for this request.
|
||||
* @returns A Promise with the resulting read-only stream.
|
||||
*/
|
||||
requestStream(methodName: FirestoreStreamingMethod, request: {}, requestTag: string): Promise<Duplex>;
|
||||
}
|
||||
/**
|
||||
* A logging function that takes a single string.
|
||||
*
|
||||
* @callback Firestore~logFunction
|
||||
* @param {string} Log message
|
||||
*/
|
||||
/**
|
||||
* The default export of the `@google-cloud/firestore` package is the
|
||||
* {@link Firestore} class.
|
||||
*
|
||||
* See {@link Firestore} and {@link ClientConfig} for client methods and
|
||||
* configuration options.
|
||||
*
|
||||
* @module {Firestore} @google-cloud/firestore
|
||||
* @alias nodejs-firestore
|
||||
*
|
||||
* @example <caption>Install the client library with <a
|
||||
* href="https://www.npmjs.com/">npm</a>:</caption> npm install --save
|
||||
* @google-cloud/firestore
|
||||
*
|
||||
* @example <caption>Import the client library</caption>
|
||||
* var Firestore = require('@google-cloud/firestore');
|
||||
*
|
||||
* @example <caption>Create a client that uses <a
|
||||
* href="https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application">Application
|
||||
* Default Credentials (ADC)</a>:</caption> var firestore = new Firestore();
|
||||
*
|
||||
* @example <caption>Create a client with <a
|
||||
* href="https://cloud.google.com/docs/authentication/production#obtaining_and_providing_service_account_credentials_manually">explicit
|
||||
* credentials</a>:</caption> var firestore = new Firestore({ projectId:
|
||||
* 'your-project-id', keyFilename: '/path/to/keyfile.json'
|
||||
* });
|
||||
*
|
||||
* @example <caption>include:samples/quickstart.js</caption>
|
||||
* region_tag:firestore_quickstart
|
||||
* Full quickstart example:
|
||||
*/
|
||||
export default Firestore;
|
||||
+1375
File diff suppressed because it is too large
Load Diff
+37
@@ -0,0 +1,37 @@
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
/**
|
||||
* Log function to use for debug output. By default, we don't perform any
|
||||
* logging.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function logger(methodName: string, requestTag: string | null, logMessage: string, ...additionalArgs: unknown[]): void;
|
||||
/**
|
||||
* Sets or disables the log function for all active Firestore instances.
|
||||
*
|
||||
* @param logger A log function that takes a message (such as `console.log`) or
|
||||
* `null` to turn off logging.
|
||||
*/
|
||||
export declare function setLogFunction(logger: ((msg: string) => void) | null): void;
|
||||
/**
|
||||
* Sets the library version to be used in log messages.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function setLibVersion(version: string): void;
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const util = require("util");
|
||||
const validate_1 = require("./validate");
|
||||
/*! The Firestore library version */
|
||||
let libVersion;
|
||||
/*! The external function used to emit logs. */
|
||||
let logFunction = null;
|
||||
/**
|
||||
* Log function to use for debug output. By default, we don't perform any
|
||||
* logging.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function logger(methodName, requestTag, logMessage, ...additionalArgs) {
|
||||
requestTag = requestTag || '#####';
|
||||
if (logFunction) {
|
||||
const formattedMessage = util.format(logMessage, ...additionalArgs);
|
||||
const time = new Date().toISOString();
|
||||
logFunction(`Firestore (${libVersion}) ${time} ${requestTag} [${methodName}]: ` +
|
||||
formattedMessage);
|
||||
}
|
||||
}
|
||||
exports.logger = logger;
|
||||
/**
|
||||
* Sets or disables the log function for all active Firestore instances.
|
||||
*
|
||||
* @param logger A log function that takes a message (such as `console.log`) or
|
||||
* `null` to turn off logging.
|
||||
*/
|
||||
function setLogFunction(logger) {
|
||||
if (logger !== null)
|
||||
validate_1.validateFunction('logger', logger);
|
||||
logFunction = logger;
|
||||
}
|
||||
exports.setLogFunction = setLogFunction;
|
||||
/**
|
||||
* Sets the library version to be used in log messages.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function setLibVersion(version) {
|
||||
libVersion = version;
|
||||
}
|
||||
exports.setLibVersion = setLibVersion;
|
||||
//# sourceMappingURL=logger.js.map
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { google } from '../protos/firestore_v1_proto_api';
|
||||
import api = google.firestore.v1;
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function primitiveComparator(left: string | boolean | number, right: string | boolean | number): number;
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function compareArrays(left: api.IValue[], right: api.IValue[]): number;
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function compare(left: api.IValue, right: api.IValue): number;
|
||||
+242
@@ -0,0 +1,242 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const convert_1 = require("./convert");
|
||||
const path_1 = require("./path");
|
||||
/*!
|
||||
* The type order as defined by the backend.
|
||||
*/
|
||||
var TypeOrder;
|
||||
(function (TypeOrder) {
|
||||
TypeOrder[TypeOrder["NULL"] = 0] = "NULL";
|
||||
TypeOrder[TypeOrder["BOOLEAN"] = 1] = "BOOLEAN";
|
||||
TypeOrder[TypeOrder["NUMBER"] = 2] = "NUMBER";
|
||||
TypeOrder[TypeOrder["TIMESTAMP"] = 3] = "TIMESTAMP";
|
||||
TypeOrder[TypeOrder["STRING"] = 4] = "STRING";
|
||||
TypeOrder[TypeOrder["BLOB"] = 5] = "BLOB";
|
||||
TypeOrder[TypeOrder["REF"] = 6] = "REF";
|
||||
TypeOrder[TypeOrder["GEO_POINT"] = 7] = "GEO_POINT";
|
||||
TypeOrder[TypeOrder["ARRAY"] = 8] = "ARRAY";
|
||||
TypeOrder[TypeOrder["OBJECT"] = 9] = "OBJECT";
|
||||
})(TypeOrder || (TypeOrder = {}));
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function typeOrder(val) {
|
||||
const valueType = convert_1.detectValueType(val);
|
||||
switch (valueType) {
|
||||
case 'nullValue':
|
||||
return TypeOrder.NULL;
|
||||
case 'integerValue':
|
||||
return TypeOrder.NUMBER;
|
||||
case 'doubleValue':
|
||||
return TypeOrder.NUMBER;
|
||||
case 'stringValue':
|
||||
return TypeOrder.STRING;
|
||||
case 'booleanValue':
|
||||
return TypeOrder.BOOLEAN;
|
||||
case 'arrayValue':
|
||||
return TypeOrder.ARRAY;
|
||||
case 'timestampValue':
|
||||
return TypeOrder.TIMESTAMP;
|
||||
case 'geoPointValue':
|
||||
return TypeOrder.GEO_POINT;
|
||||
case 'bytesValue':
|
||||
return TypeOrder.BLOB;
|
||||
case 'referenceValue':
|
||||
return TypeOrder.REF;
|
||||
case 'mapValue':
|
||||
return TypeOrder.OBJECT;
|
||||
default:
|
||||
throw new Error('Unexpected value type: ' + valueType);
|
||||
}
|
||||
}
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function primitiveComparator(left, right) {
|
||||
if (left < right) {
|
||||
return -1;
|
||||
}
|
||||
if (left > right) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
exports.primitiveComparator = primitiveComparator;
|
||||
/*!
|
||||
* Utility function to compare doubles (using Firestore semantics for NaN).
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compareNumbers(left, right) {
|
||||
if (left < right) {
|
||||
return -1;
|
||||
}
|
||||
if (left > right) {
|
||||
return 1;
|
||||
}
|
||||
if (left === right) {
|
||||
return 0;
|
||||
}
|
||||
// one or both are NaN.
|
||||
if (isNaN(left)) {
|
||||
return isNaN(right) ? 0 : -1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compareNumberProtos(left, right) {
|
||||
let leftValue, rightValue;
|
||||
if (left.integerValue !== undefined) {
|
||||
leftValue = Number(left.integerValue);
|
||||
}
|
||||
else {
|
||||
leftValue = Number(left.doubleValue);
|
||||
}
|
||||
if (right.integerValue !== undefined) {
|
||||
rightValue = Number(right.integerValue);
|
||||
}
|
||||
else {
|
||||
rightValue = Number(right.doubleValue);
|
||||
}
|
||||
return compareNumbers(leftValue, rightValue);
|
||||
}
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compareTimestamps(left, right) {
|
||||
const seconds = primitiveComparator(left.seconds || 0, right.seconds || 0);
|
||||
if (seconds !== 0) {
|
||||
return seconds;
|
||||
}
|
||||
return primitiveComparator(left.nanos || 0, right.nanos || 0);
|
||||
}
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compareBlobs(left, right) {
|
||||
if (!(left instanceof Buffer) || !(right instanceof Buffer)) {
|
||||
throw new Error('Blobs can only be compared if they are Buffers.');
|
||||
}
|
||||
return Buffer.compare(left, right);
|
||||
}
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compareReferenceProtos(left, right) {
|
||||
const leftPath = path_1.QualifiedResourcePath.fromSlashSeparatedString(left.referenceValue);
|
||||
const rightPath = path_1.QualifiedResourcePath.fromSlashSeparatedString(right.referenceValue);
|
||||
return leftPath.compareTo(rightPath);
|
||||
}
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compareGeoPoints(left, right) {
|
||||
return (primitiveComparator(left.latitude || 0, right.latitude || 0) ||
|
||||
primitiveComparator(left.longitude || 0, right.longitude || 0));
|
||||
}
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compareArrays(left, right) {
|
||||
for (let i = 0; i < left.length && i < right.length; i++) {
|
||||
const valueComparison = compare(left[i], right[i]);
|
||||
if (valueComparison !== 0) {
|
||||
return valueComparison;
|
||||
}
|
||||
}
|
||||
// If all the values matched so far, just check the length.
|
||||
return primitiveComparator(left.length, right.length);
|
||||
}
|
||||
exports.compareArrays = compareArrays;
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compareObjects(left, right) {
|
||||
// This requires iterating over the keys in the object in order and doing a
|
||||
// deep comparison.
|
||||
const leftKeys = Object.keys(left);
|
||||
const rightKeys = Object.keys(right);
|
||||
leftKeys.sort();
|
||||
rightKeys.sort();
|
||||
for (let i = 0; i < leftKeys.length && i < rightKeys.length; i++) {
|
||||
const keyComparison = primitiveComparator(leftKeys[i], rightKeys[i]);
|
||||
if (keyComparison !== 0) {
|
||||
return keyComparison;
|
||||
}
|
||||
const key = leftKeys[i];
|
||||
const valueComparison = compare(left[key], right[key]);
|
||||
if (valueComparison !== 0) {
|
||||
return valueComparison;
|
||||
}
|
||||
}
|
||||
// If all the keys matched so far, just check the length.
|
||||
return primitiveComparator(leftKeys.length, rightKeys.length);
|
||||
}
|
||||
/*!
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function compare(left, right) {
|
||||
// First compare the types.
|
||||
const leftType = typeOrder(left);
|
||||
const rightType = typeOrder(right);
|
||||
const typeComparison = primitiveComparator(leftType, rightType);
|
||||
if (typeComparison !== 0) {
|
||||
return typeComparison;
|
||||
}
|
||||
// So they are the same type.
|
||||
switch (leftType) {
|
||||
case TypeOrder.NULL:
|
||||
// Nulls are all equal.
|
||||
return 0;
|
||||
case TypeOrder.BOOLEAN:
|
||||
return primitiveComparator(left.booleanValue, right.booleanValue);
|
||||
case TypeOrder.STRING:
|
||||
return primitiveComparator(left.stringValue, right.stringValue);
|
||||
case TypeOrder.NUMBER:
|
||||
return compareNumberProtos(left, right);
|
||||
case TypeOrder.TIMESTAMP:
|
||||
return compareTimestamps(left.timestampValue, right.timestampValue);
|
||||
case TypeOrder.BLOB:
|
||||
return compareBlobs(left.bytesValue, right.bytesValue);
|
||||
case TypeOrder.REF:
|
||||
return compareReferenceProtos(left, right);
|
||||
case TypeOrder.GEO_POINT:
|
||||
return compareGeoPoints(left.geoPointValue, right.geoPointValue);
|
||||
case TypeOrder.ARRAY:
|
||||
return compareArrays(left.arrayValue.values || [], right.arrayValue.values || []);
|
||||
case TypeOrder.OBJECT:
|
||||
return compareObjects(left.mapValue.fields || {}, right.mapValue.fields || {});
|
||||
default:
|
||||
throw new Error(`Encountered unknown type order: ${leftType}`);
|
||||
}
|
||||
}
|
||||
exports.compare = compare;
|
||||
//# sourceMappingURL=order.js.map
|
||||
+408
@@ -0,0 +1,408 @@
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { google } from '../protos/firestore_v1_proto_api';
|
||||
import api = google.firestore.v1;
|
||||
/*!
|
||||
* The default database ID for this Firestore client. We do not yet expose the
|
||||
* ability to use different databases.
|
||||
*/
|
||||
export declare const DEFAULT_DATABASE_ID = "(default)";
|
||||
/**
|
||||
* An abstract class representing a Firestore path.
|
||||
*
|
||||
* Subclasses have to implement `split()` and `canonicalString()`.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @class
|
||||
*/
|
||||
declare abstract class Path<T> {
|
||||
protected readonly segments: string[];
|
||||
/**
|
||||
* Creates a new Path with the given segments.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @hideconstructor
|
||||
* @param segments Sequence of parts of a path.
|
||||
*/
|
||||
constructor(segments: string[]);
|
||||
/**
|
||||
* Returns the number of segments of this field path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get size(): number;
|
||||
abstract construct(segments: string[] | string): T;
|
||||
abstract split(relativePath: string): string[];
|
||||
/**
|
||||
* Create a child path beneath the current level.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param relativePath Relative path to append to the current path.
|
||||
* @returns The new path.
|
||||
*/
|
||||
append(relativePath: Path<T> | string): T;
|
||||
/**
|
||||
* Returns the path of the parent node.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The new path or null if we are already at the root.
|
||||
*/
|
||||
parent(): T | null;
|
||||
/**
|
||||
* Checks whether the current path is a prefix of the specified path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param other The path to check against.
|
||||
* @returns 'true' iff the current path is a prefix match with 'other'.
|
||||
*/
|
||||
isPrefixOf(other: Path<T>): boolean;
|
||||
/**
|
||||
* Compare the current path against another Path object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param other The path to compare to.
|
||||
* @returns -1 if current < other, 1 if current > other, 0 if equal
|
||||
*/
|
||||
compareTo(other: Path<T>): number;
|
||||
/**
|
||||
* Returns a copy of the underlying segments.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns A copy of the segments that make up this path.
|
||||
*/
|
||||
toArray(): string[];
|
||||
/**
|
||||
* Pops the last segment from this `Path` and returns a newly constructed
|
||||
* `Path`.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The newly created Path.
|
||||
*/
|
||||
popLast(): T;
|
||||
/**
|
||||
* Returns true if this `Path` is equal to the provided value.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param other The value to compare against.
|
||||
* @return true if this `Path` is equal to the provided value.
|
||||
*/
|
||||
isEqual(other: Path<T>): boolean;
|
||||
}
|
||||
/**
|
||||
* A slash-separated path for navigating resources within the current Firestore
|
||||
* instance.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class ResourcePath extends Path<ResourcePath> {
|
||||
/**
|
||||
* A default instance pointing to the root collection.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
static EMPTY: ResourcePath;
|
||||
/**
|
||||
* Constructs a ResourcePath.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param segments Sequence of names of the parts of the path.
|
||||
*/
|
||||
constructor(...segments: string[]);
|
||||
/**
|
||||
* Indicates whether this path points to a document.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get isDocument(): boolean;
|
||||
/**
|
||||
* Indicates whether this path points to a collection.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get isCollection(): boolean;
|
||||
/**
|
||||
* The last component of the path.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get id(): string | null;
|
||||
/**
|
||||
* Returns the location of this path relative to the root of the project's
|
||||
* database.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get relativeName(): string;
|
||||
/**
|
||||
* Constructs a new instance of ResourcePath.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param segments Sequence of parts of the path.
|
||||
* @returns The newly created ResourcePath.
|
||||
*/
|
||||
construct(segments: string[]): ResourcePath;
|
||||
/**
|
||||
* Splits a string into path segments, using slashes as separators.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param relativePath The path to split.
|
||||
* @returns The split path segments.
|
||||
*/
|
||||
split(relativePath: string): string[];
|
||||
/**
|
||||
* Converts this path to a fully qualified ResourcePath.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param projectIdIfMissing The project ID of the current Firestore project.
|
||||
* The project ID is only used if it's not provided as part of this
|
||||
* ResourcePath.
|
||||
* @return A fully-qualified resource path pointing to the same element.
|
||||
*/
|
||||
toQualifiedResourcePath(projectIdIfMissing: string): QualifiedResourcePath;
|
||||
}
|
||||
/**
|
||||
* A slash-separated path that includes a project and database ID for referring
|
||||
* to resources in any Firestore project.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class QualifiedResourcePath extends ResourcePath {
|
||||
/**
|
||||
* The project ID of this path.
|
||||
*/
|
||||
readonly projectId: string;
|
||||
/**
|
||||
* The database ID of this path.
|
||||
*/
|
||||
readonly databaseId: string;
|
||||
/**
|
||||
* Constructs a Firestore Resource Path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param projectId The Firestore project id.
|
||||
* @param databaseId The Firestore database id.
|
||||
* @param segments Sequence of names of the parts of the path.
|
||||
*/
|
||||
constructor(projectId: string, databaseId: string, ...segments: string[]);
|
||||
/**
|
||||
* String representation of the path relative to the database root.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get relativeName(): string;
|
||||
/**
|
||||
* Creates a resource path from an absolute Firestore path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param absolutePath A string representation of a Resource Path.
|
||||
* @returns The new ResourcePath.
|
||||
*/
|
||||
static fromSlashSeparatedString(absolutePath: string): QualifiedResourcePath;
|
||||
/**
|
||||
* Create a child path beneath the current level.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param relativePath Relative path to append to the current path.
|
||||
* @returns The new path.
|
||||
*/
|
||||
append(relativePath: ResourcePath | string): QualifiedResourcePath;
|
||||
/**
|
||||
* Create a child path beneath the current level.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The new path.
|
||||
*/
|
||||
parent(): QualifiedResourcePath | null;
|
||||
/**
|
||||
* String representation of a ResourcePath as expected by the API.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The representation as expected by the API.
|
||||
*/
|
||||
get formattedName(): string;
|
||||
/**
|
||||
* Constructs a new instance of ResourcePath. We need this instead of using
|
||||
* the normal constructor because polymorphic 'this' doesn't work on static
|
||||
* methods.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param segments Sequence of names of the parts of the path.
|
||||
* @returns The newly created QualifiedResourcePath.
|
||||
*/
|
||||
construct(segments: string[]): QualifiedResourcePath;
|
||||
/**
|
||||
* Convenience method to match the ResourcePath API. This method always
|
||||
* returns the current instance.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toQualifiedResourcePath(): QualifiedResourcePath;
|
||||
/**
|
||||
* Compare the current path against another ResourcePath object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param other The path to compare to.
|
||||
* @returns -1 if current < other, 1 if current > other, 0 if equal
|
||||
*/
|
||||
compareTo(other: ResourcePath): number;
|
||||
/**
|
||||
* Converts this ResourcePath to the Firestore Proto representation.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toProto(): api.IValue;
|
||||
}
|
||||
/**
|
||||
* Validates that the given string can be used as a relative or absolute
|
||||
* resource path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param resourcePath The path to validate.
|
||||
* @throws if the string can't be used as a resource path.
|
||||
*/
|
||||
export declare function validateResourcePath(arg: string | number, resourcePath: string): void;
|
||||
/**
|
||||
* A dot-separated path for navigating sub-objects (e.g. nested maps) within a document.
|
||||
*
|
||||
* @class
|
||||
*/
|
||||
export declare class FieldPath extends Path<FieldPath> implements firestore.FieldPath {
|
||||
/**
|
||||
* A special sentinel value to refer to the ID of a document.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private static _DOCUMENT_ID;
|
||||
/**
|
||||
* Constructs a Firestore Field Path.
|
||||
*
|
||||
* @param {...string} segments Sequence of field names that form this path.
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col');
|
||||
* let fieldPath = new FieldPath('f.o.o', 'bar');
|
||||
*
|
||||
* query.where(fieldPath, '==', 42).get().then(snapshot => {
|
||||
* snapshot.forEach(document => {
|
||||
* console.log(`Document contains {'f.o.o' : {'bar' : 42}}`);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
constructor(...segments: string[]);
|
||||
/**
|
||||
* A special FieldPath value to refer to the ID of a document. It can be used
|
||||
* in queries to sort or filter by the document ID.
|
||||
*
|
||||
* @returns {FieldPath}
|
||||
*/
|
||||
static documentId(): FieldPath;
|
||||
/**
|
||||
* Turns a field path argument into a [FieldPath]{@link FieldPath}.
|
||||
* Supports FieldPaths as input (which are passed through) and dot-separated
|
||||
* strings.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param {string|FieldPath} fieldPath The FieldPath to create.
|
||||
* @returns {FieldPath} A field path representation.
|
||||
*/
|
||||
static fromArgument(fieldPath: string | firestore.FieldPath): FieldPath;
|
||||
/**
|
||||
* String representation of a FieldPath as expected by the API.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @override
|
||||
* @returns {string} The representation as expected by the API.
|
||||
*/
|
||||
get formattedName(): string;
|
||||
/**
|
||||
* Returns a string representation of this path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns A string representing this path.
|
||||
*/
|
||||
toString(): string;
|
||||
/**
|
||||
* Splits a string into path segments, using dots as separators.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @override
|
||||
* @param {string} fieldPath The path to split.
|
||||
* @returns {Array.<string>} - The split path segments.
|
||||
*/
|
||||
split(fieldPath: string): string[];
|
||||
/**
|
||||
* Constructs a new instance of FieldPath. We need this instead of using
|
||||
* the normal constructor because polymorphic 'this' doesn't work on static
|
||||
* methods.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @override
|
||||
* @param segments Sequence of field names.
|
||||
* @returns The newly created FieldPath.
|
||||
*/
|
||||
construct(segments: string[]): FieldPath;
|
||||
/**
|
||||
* Returns true if this `FieldPath` is equal to the provided value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return {boolean} true if this `FieldPath` is equal to the provided value.
|
||||
*/
|
||||
isEqual(other: FieldPath): boolean;
|
||||
}
|
||||
/**
|
||||
* Validates that the provided value can be used as a field path argument.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param fieldPath The value to verify.
|
||||
* @throws if the string can't be used as a field path.
|
||||
*/
|
||||
export declare function validateFieldPath(arg: string | number, fieldPath: unknown): asserts fieldPath is string | FieldPath;
|
||||
export {};
|
||||
+619
@@ -0,0 +1,619 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const util_1 = require("./util");
|
||||
const validate_1 = require("./validate");
|
||||
/*!
|
||||
* The default database ID for this Firestore client. We do not yet expose the
|
||||
* ability to use different databases.
|
||||
*/
|
||||
exports.DEFAULT_DATABASE_ID = '(default)';
|
||||
/*!
|
||||
* A regular expression to verify an absolute Resource Path in Firestore. It
|
||||
* extracts the project ID, the database name and the relative resource path
|
||||
* if available.
|
||||
*
|
||||
* @type {RegExp}
|
||||
*/
|
||||
const RESOURCE_PATH_RE =
|
||||
// Note: [\s\S] matches all characters including newlines.
|
||||
/^projects\/([^/]*)\/databases\/([^/]*)(?:\/documents\/)?([\s\S]*)$/;
|
||||
/*!
|
||||
* A regular expression to verify whether a field name can be passed to the
|
||||
* backend without escaping.
|
||||
*
|
||||
* @type {RegExp}
|
||||
*/
|
||||
const UNESCAPED_FIELD_NAME_RE = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
|
||||
/*!
|
||||
* A regular expression to verify field paths that are passed to the API as
|
||||
* strings. Field paths that do not match this expression have to be provided
|
||||
* as a [FieldPath]{@link FieldPath} object.
|
||||
*
|
||||
* @type {RegExp}
|
||||
*/
|
||||
const FIELD_PATH_RE = /^[^*~/[\]]+$/;
|
||||
/**
|
||||
* An abstract class representing a Firestore path.
|
||||
*
|
||||
* Subclasses have to implement `split()` and `canonicalString()`.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @class
|
||||
*/
|
||||
class Path {
|
||||
/**
|
||||
* Creates a new Path with the given segments.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @hideconstructor
|
||||
* @param segments Sequence of parts of a path.
|
||||
*/
|
||||
constructor(segments) {
|
||||
this.segments = segments;
|
||||
}
|
||||
/**
|
||||
* Returns the number of segments of this field path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get size() {
|
||||
return this.segments.length;
|
||||
}
|
||||
/**
|
||||
* Create a child path beneath the current level.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param relativePath Relative path to append to the current path.
|
||||
* @returns The new path.
|
||||
*/
|
||||
append(relativePath) {
|
||||
if (relativePath instanceof Path) {
|
||||
return this.construct(this.segments.concat(relativePath.segments));
|
||||
}
|
||||
return this.construct(this.segments.concat(this.split(relativePath)));
|
||||
}
|
||||
/**
|
||||
* Returns the path of the parent node.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The new path or null if we are already at the root.
|
||||
*/
|
||||
parent() {
|
||||
if (this.segments.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return this.construct(this.segments.slice(0, this.segments.length - 1));
|
||||
}
|
||||
/**
|
||||
* Checks whether the current path is a prefix of the specified path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param other The path to check against.
|
||||
* @returns 'true' iff the current path is a prefix match with 'other'.
|
||||
*/
|
||||
isPrefixOf(other) {
|
||||
if (other.segments.length < this.segments.length) {
|
||||
return false;
|
||||
}
|
||||
for (let i = 0; i < this.segments.length; i++) {
|
||||
if (this.segments[i] !== other.segments[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Compare the current path against another Path object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param other The path to compare to.
|
||||
* @returns -1 if current < other, 1 if current > other, 0 if equal
|
||||
*/
|
||||
compareTo(other) {
|
||||
const len = Math.min(this.segments.length, other.segments.length);
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (this.segments[i] < other.segments[i]) {
|
||||
return -1;
|
||||
}
|
||||
if (this.segments[i] > other.segments[i]) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (this.segments.length < other.segments.length) {
|
||||
return -1;
|
||||
}
|
||||
if (this.segments.length > other.segments.length) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* Returns a copy of the underlying segments.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns A copy of the segments that make up this path.
|
||||
*/
|
||||
toArray() {
|
||||
return this.segments.slice();
|
||||
}
|
||||
/**
|
||||
* Pops the last segment from this `Path` and returns a newly constructed
|
||||
* `Path`.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The newly created Path.
|
||||
*/
|
||||
popLast() {
|
||||
this.segments.pop();
|
||||
return this.construct(this.segments);
|
||||
}
|
||||
/**
|
||||
* Returns true if this `Path` is equal to the provided value.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param other The value to compare against.
|
||||
* @return true if this `Path` is equal to the provided value.
|
||||
*/
|
||||
isEqual(other) {
|
||||
return this === other || this.compareTo(other) === 0;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* A slash-separated path for navigating resources within the current Firestore
|
||||
* instance.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class ResourcePath extends Path {
|
||||
/**
|
||||
* Constructs a ResourcePath.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param segments Sequence of names of the parts of the path.
|
||||
*/
|
||||
constructor(...segments) {
|
||||
super(segments);
|
||||
}
|
||||
/**
|
||||
* Indicates whether this path points to a document.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get isDocument() {
|
||||
return this.segments.length > 0 && this.segments.length % 2 === 0;
|
||||
}
|
||||
/**
|
||||
* Indicates whether this path points to a collection.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get isCollection() {
|
||||
return this.segments.length % 2 === 1;
|
||||
}
|
||||
/**
|
||||
* The last component of the path.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get id() {
|
||||
if (this.segments.length > 0) {
|
||||
return this.segments[this.segments.length - 1];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Returns the location of this path relative to the root of the project's
|
||||
* database.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get relativeName() {
|
||||
return this.segments.join('/');
|
||||
}
|
||||
/**
|
||||
* Constructs a new instance of ResourcePath.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param segments Sequence of parts of the path.
|
||||
* @returns The newly created ResourcePath.
|
||||
*/
|
||||
construct(segments) {
|
||||
return new ResourcePath(...segments);
|
||||
}
|
||||
/**
|
||||
* Splits a string into path segments, using slashes as separators.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param relativePath The path to split.
|
||||
* @returns The split path segments.
|
||||
*/
|
||||
split(relativePath) {
|
||||
// We may have an empty segment at the beginning or end if they had a
|
||||
// leading or trailing slash (which we allow).
|
||||
return relativePath.split('/').filter(segment => segment.length > 0);
|
||||
}
|
||||
/**
|
||||
* Converts this path to a fully qualified ResourcePath.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param projectIdIfMissing The project ID of the current Firestore project.
|
||||
* The project ID is only used if it's not provided as part of this
|
||||
* ResourcePath.
|
||||
* @return A fully-qualified resource path pointing to the same element.
|
||||
*/
|
||||
toQualifiedResourcePath(projectIdIfMissing) {
|
||||
return new QualifiedResourcePath(projectIdIfMissing, exports.DEFAULT_DATABASE_ID, ...this.segments);
|
||||
}
|
||||
}
|
||||
exports.ResourcePath = ResourcePath;
|
||||
/**
|
||||
* A default instance pointing to the root collection.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
ResourcePath.EMPTY = new ResourcePath();
|
||||
/**
|
||||
* A slash-separated path that includes a project and database ID for referring
|
||||
* to resources in any Firestore project.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class QualifiedResourcePath extends ResourcePath {
|
||||
/**
|
||||
* Constructs a Firestore Resource Path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param projectId The Firestore project id.
|
||||
* @param databaseId The Firestore database id.
|
||||
* @param segments Sequence of names of the parts of the path.
|
||||
*/
|
||||
constructor(projectId, databaseId, ...segments) {
|
||||
super(...segments);
|
||||
this.projectId = projectId;
|
||||
this.databaseId = databaseId;
|
||||
}
|
||||
/**
|
||||
* String representation of the path relative to the database root.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get relativeName() {
|
||||
return this.segments.join('/');
|
||||
}
|
||||
/**
|
||||
* Creates a resource path from an absolute Firestore path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param absolutePath A string representation of a Resource Path.
|
||||
* @returns The new ResourcePath.
|
||||
*/
|
||||
static fromSlashSeparatedString(absolutePath) {
|
||||
const elements = RESOURCE_PATH_RE.exec(absolutePath);
|
||||
if (elements) {
|
||||
const project = elements[1];
|
||||
const database = elements[2];
|
||||
const path = elements[3];
|
||||
return new QualifiedResourcePath(project, database).append(path);
|
||||
}
|
||||
throw new Error(`Resource name '${absolutePath}' is not valid.`);
|
||||
}
|
||||
/**
|
||||
* Create a child path beneath the current level.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param relativePath Relative path to append to the current path.
|
||||
* @returns The new path.
|
||||
*/
|
||||
append(relativePath) {
|
||||
// `super.append()` calls `QualifiedResourcePath.construct()` when invoked
|
||||
// from here and returns a QualifiedResourcePath.
|
||||
return super.append(relativePath);
|
||||
}
|
||||
/**
|
||||
* Create a child path beneath the current level.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The new path.
|
||||
*/
|
||||
parent() {
|
||||
return super.parent();
|
||||
}
|
||||
/**
|
||||
* String representation of a ResourcePath as expected by the API.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns The representation as expected by the API.
|
||||
*/
|
||||
get formattedName() {
|
||||
const components = [
|
||||
'projects',
|
||||
this.projectId,
|
||||
'databases',
|
||||
this.databaseId,
|
||||
'documents',
|
||||
...this.segments,
|
||||
];
|
||||
return components.join('/');
|
||||
}
|
||||
/**
|
||||
* Constructs a new instance of ResourcePath. We need this instead of using
|
||||
* the normal constructor because polymorphic 'this' doesn't work on static
|
||||
* methods.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param segments Sequence of names of the parts of the path.
|
||||
* @returns The newly created QualifiedResourcePath.
|
||||
*/
|
||||
construct(segments) {
|
||||
return new QualifiedResourcePath(this.projectId, this.databaseId, ...segments);
|
||||
}
|
||||
/**
|
||||
* Convenience method to match the ResourcePath API. This method always
|
||||
* returns the current instance.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toQualifiedResourcePath() {
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Compare the current path against another ResourcePath object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param other The path to compare to.
|
||||
* @returns -1 if current < other, 1 if current > other, 0 if equal
|
||||
*/
|
||||
compareTo(other) {
|
||||
if (other instanceof QualifiedResourcePath) {
|
||||
if (this.projectId < other.projectId) {
|
||||
return -1;
|
||||
}
|
||||
if (this.projectId > other.projectId) {
|
||||
return 1;
|
||||
}
|
||||
if (this.databaseId < other.databaseId) {
|
||||
return -1;
|
||||
}
|
||||
if (this.databaseId > other.databaseId) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return super.compareTo(other);
|
||||
}
|
||||
/**
|
||||
* Converts this ResourcePath to the Firestore Proto representation.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
toProto() {
|
||||
return {
|
||||
referenceValue: this.formattedName,
|
||||
};
|
||||
}
|
||||
}
|
||||
exports.QualifiedResourcePath = QualifiedResourcePath;
|
||||
/**
|
||||
* Validates that the given string can be used as a relative or absolute
|
||||
* resource path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param resourcePath The path to validate.
|
||||
* @throws if the string can't be used as a resource path.
|
||||
*/
|
||||
function validateResourcePath(arg, resourcePath) {
|
||||
if (typeof resourcePath !== 'string' || resourcePath === '') {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'resource path')} Path must be a non-empty string.`);
|
||||
}
|
||||
if (resourcePath.indexOf('//') >= 0) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'resource path')} Paths must not contain //.`);
|
||||
}
|
||||
}
|
||||
exports.validateResourcePath = validateResourcePath;
|
||||
/**
|
||||
* A dot-separated path for navigating sub-objects (e.g. nested maps) within a document.
|
||||
*
|
||||
* @class
|
||||
*/
|
||||
class FieldPath extends Path {
|
||||
/**
|
||||
* Constructs a Firestore Field Path.
|
||||
*
|
||||
* @param {...string} segments Sequence of field names that form this path.
|
||||
*
|
||||
* @example
|
||||
* let query = firestore.collection('col');
|
||||
* let fieldPath = new FieldPath('f.o.o', 'bar');
|
||||
*
|
||||
* query.where(fieldPath, '==', 42).get().then(snapshot => {
|
||||
* snapshot.forEach(document => {
|
||||
* console.log(`Document contains {'f.o.o' : {'bar' : 42}}`);
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
constructor(...segments) {
|
||||
if (Array.isArray(segments[0])) {
|
||||
throw new Error('The FieldPath constructor no longer supports an array as its first argument. ' +
|
||||
'Please unpack your array and call FieldPath() with individual arguments.');
|
||||
}
|
||||
validate_1.validateMinNumberOfArguments('FieldPath', segments, 1);
|
||||
for (let i = 0; i < segments.length; ++i) {
|
||||
validate_1.validateString(i, segments[i]);
|
||||
if (segments[i].length === 0) {
|
||||
throw new Error(`Element at index ${i} should not be an empty string.`);
|
||||
}
|
||||
}
|
||||
super(segments);
|
||||
}
|
||||
/**
|
||||
* A special FieldPath value to refer to the ID of a document. It can be used
|
||||
* in queries to sort or filter by the document ID.
|
||||
*
|
||||
* @returns {FieldPath}
|
||||
*/
|
||||
static documentId() {
|
||||
return FieldPath._DOCUMENT_ID;
|
||||
}
|
||||
/**
|
||||
* Turns a field path argument into a [FieldPath]{@link FieldPath}.
|
||||
* Supports FieldPaths as input (which are passed through) and dot-separated
|
||||
* strings.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param {string|FieldPath} fieldPath The FieldPath to create.
|
||||
* @returns {FieldPath} A field path representation.
|
||||
*/
|
||||
static fromArgument(fieldPath) {
|
||||
// validateFieldPath() is used in all public API entry points to validate
|
||||
// that fromArgument() is only called with a Field Path or a string.
|
||||
return fieldPath instanceof FieldPath
|
||||
? fieldPath
|
||||
: new FieldPath(...fieldPath.split('.'));
|
||||
}
|
||||
/**
|
||||
* String representation of a FieldPath as expected by the API.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @override
|
||||
* @returns {string} The representation as expected by the API.
|
||||
*/
|
||||
get formattedName() {
|
||||
return this.segments
|
||||
.map(str => {
|
||||
return UNESCAPED_FIELD_NAME_RE.test(str)
|
||||
? str
|
||||
: '`' + str.replace('\\', '\\\\').replace('`', '\\`') + '`';
|
||||
})
|
||||
.join('.');
|
||||
}
|
||||
/**
|
||||
* Returns a string representation of this path.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns A string representing this path.
|
||||
*/
|
||||
toString() {
|
||||
return this.formattedName;
|
||||
}
|
||||
/**
|
||||
* Splits a string into path segments, using dots as separators.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @override
|
||||
* @param {string} fieldPath The path to split.
|
||||
* @returns {Array.<string>} - The split path segments.
|
||||
*/
|
||||
split(fieldPath) {
|
||||
return fieldPath.split('.');
|
||||
}
|
||||
/**
|
||||
* Constructs a new instance of FieldPath. We need this instead of using
|
||||
* the normal constructor because polymorphic 'this' doesn't work on static
|
||||
* methods.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @override
|
||||
* @param segments Sequence of field names.
|
||||
* @returns The newly created FieldPath.
|
||||
*/
|
||||
construct(segments) {
|
||||
return new FieldPath(...segments);
|
||||
}
|
||||
/**
|
||||
* Returns true if this `FieldPath` is equal to the provided value.
|
||||
*
|
||||
* @param {*} other The value to compare against.
|
||||
* @return {boolean} true if this `FieldPath` is equal to the provided value.
|
||||
*/
|
||||
isEqual(other) {
|
||||
return super.isEqual(other);
|
||||
}
|
||||
}
|
||||
exports.FieldPath = FieldPath;
|
||||
/**
|
||||
* A special sentinel value to refer to the ID of a document.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
FieldPath._DOCUMENT_ID = new FieldPath('__name__');
|
||||
/**
|
||||
* Validates that the provided value can be used as a field path argument.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param fieldPath The value to verify.
|
||||
* @throws if the string can't be used as a field path.
|
||||
*/
|
||||
function validateFieldPath(arg, fieldPath) {
|
||||
if (fieldPath instanceof FieldPath) {
|
||||
return;
|
||||
}
|
||||
if (fieldPath === undefined) {
|
||||
throw new Error(validate_1.invalidArgumentMessage(arg, 'field path') + ' The path cannot be omitted.');
|
||||
}
|
||||
if (util_1.isObject(fieldPath) && fieldPath.constructor.name === 'FieldPath') {
|
||||
throw new Error(validate_1.customObjectMessage(arg, fieldPath));
|
||||
}
|
||||
if (typeof fieldPath !== 'string') {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'field path')} Paths can only be specified as strings or via a FieldPath object.`);
|
||||
}
|
||||
if (fieldPath.indexOf('..') >= 0) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'field path')} Paths must not contain ".." in them.`);
|
||||
}
|
||||
if (fieldPath.startsWith('.') || fieldPath.endsWith('.')) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'field path')} Paths must not start or end with ".".`);
|
||||
}
|
||||
if (!FIELD_PATH_RE.test(fieldPath)) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'field path')} Paths can't be empty and must not contain
|
||||
"*~/[]".`);
|
||||
}
|
||||
}
|
||||
exports.validateFieldPath = validateFieldPath;
|
||||
//# sourceMappingURL=path.js.map
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
export declare const CLIENT_TERMINATED_ERROR_MSG = "The client has already been terminated";
|
||||
/**
|
||||
* An auto-resizing pool that distributes concurrent operations over multiple
|
||||
* clients of type `T`.
|
||||
*
|
||||
* ClientPool is used within Firestore to manage a pool of GAPIC clients and
|
||||
* automatically initializes multiple clients if we issue more than 100
|
||||
* concurrent operations.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class ClientPool<T> {
|
||||
private readonly concurrentOperationLimit;
|
||||
private readonly maxIdleClients;
|
||||
private readonly clientFactory;
|
||||
private readonly clientDestructor;
|
||||
/**
|
||||
* Stores each active clients and how many operations it has outstanding.
|
||||
*/
|
||||
private activeClients;
|
||||
/**
|
||||
* A set of clients that have seen RST_STREAM errors (see
|
||||
* https://github.com/googleapis/nodejs-firestore/issues/1023) and should
|
||||
* no longer be used.
|
||||
*/
|
||||
private failedClients;
|
||||
/**
|
||||
* Whether the Firestore instance has been terminated. Once terminated, the
|
||||
* ClientPool can longer schedule new operations.
|
||||
*/
|
||||
private terminated;
|
||||
/**
|
||||
* Deferred promise that is resolved when there are no active operations on
|
||||
* the client pool after terminate() has been called.
|
||||
*/
|
||||
private terminateDeferred;
|
||||
/**
|
||||
* @param concurrentOperationLimit The number of operations that each client
|
||||
* can handle.
|
||||
* @param maxIdleClients The maximum number of idle clients to keep before
|
||||
* garbage collecting.
|
||||
* @param clientFactory A factory function called as needed when new clients
|
||||
* are required.
|
||||
* @param clientDestructor A cleanup function that is called when a client is
|
||||
* disposed of.
|
||||
*/
|
||||
constructor(concurrentOperationLimit: number, maxIdleClients: number, clientFactory: () => T, clientDestructor?: (client: T) => Promise<void>);
|
||||
/**
|
||||
* Returns an already existing client if it has less than the maximum number
|
||||
* of concurrent operations or initializes and returns a new client.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private acquire;
|
||||
/**
|
||||
* Reduces the number of operations for the provided client, potentially
|
||||
* removing it from the pool of active clients.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private release;
|
||||
/**
|
||||
* Given the current operation counts, determines if the given client should
|
||||
* be garbage collected.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private shouldGarbageCollectClient;
|
||||
/**
|
||||
* The number of currently registered clients.
|
||||
*
|
||||
* @return Number of currently registered clients.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get size(): number;
|
||||
/**
|
||||
* The number of currently active operations.
|
||||
*
|
||||
* @return Number of currently active operations.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
get opCount(): number;
|
||||
/**
|
||||
* Runs the provided operation in this pool. This function may create an
|
||||
* additional client if all existing clients already operate at the concurrent
|
||||
* operation limit.
|
||||
*
|
||||
* @param requestTag A unique client-assigned identifier for this operation.
|
||||
* @param op A callback function that returns a Promise. The client T will
|
||||
* be returned to the pool when callback finishes.
|
||||
* @return A Promise that resolves with the result of `op`.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
run<V>(requestTag: string, op: (client: T) => Promise<V>): Promise<V>;
|
||||
terminate(): Promise<void>;
|
||||
}
|
||||
+220
@@ -0,0 +1,220 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const assert = require("assert");
|
||||
const logger_1 = require("./logger");
|
||||
const util_1 = require("./util");
|
||||
exports.CLIENT_TERMINATED_ERROR_MSG = 'The client has already been terminated';
|
||||
/**
|
||||
* An auto-resizing pool that distributes concurrent operations over multiple
|
||||
* clients of type `T`.
|
||||
*
|
||||
* ClientPool is used within Firestore to manage a pool of GAPIC clients and
|
||||
* automatically initializes multiple clients if we issue more than 100
|
||||
* concurrent operations.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class ClientPool {
|
||||
/**
|
||||
* @param concurrentOperationLimit The number of operations that each client
|
||||
* can handle.
|
||||
* @param maxIdleClients The maximum number of idle clients to keep before
|
||||
* garbage collecting.
|
||||
* @param clientFactory A factory function called as needed when new clients
|
||||
* are required.
|
||||
* @param clientDestructor A cleanup function that is called when a client is
|
||||
* disposed of.
|
||||
*/
|
||||
constructor(concurrentOperationLimit, maxIdleClients, clientFactory, clientDestructor = () => Promise.resolve()) {
|
||||
this.concurrentOperationLimit = concurrentOperationLimit;
|
||||
this.maxIdleClients = maxIdleClients;
|
||||
this.clientFactory = clientFactory;
|
||||
this.clientDestructor = clientDestructor;
|
||||
/**
|
||||
* Stores each active clients and how many operations it has outstanding.
|
||||
*/
|
||||
this.activeClients = new Map();
|
||||
/**
|
||||
* A set of clients that have seen RST_STREAM errors (see
|
||||
* https://github.com/googleapis/nodejs-firestore/issues/1023) and should
|
||||
* no longer be used.
|
||||
*/
|
||||
this.failedClients = new Set();
|
||||
/**
|
||||
* Whether the Firestore instance has been terminated. Once terminated, the
|
||||
* ClientPool can longer schedule new operations.
|
||||
*/
|
||||
this.terminated = false;
|
||||
/**
|
||||
* Deferred promise that is resolved when there are no active operations on
|
||||
* the client pool after terminate() has been called.
|
||||
*/
|
||||
this.terminateDeferred = new util_1.Deferred();
|
||||
}
|
||||
/**
|
||||
* Returns an already existing client if it has less than the maximum number
|
||||
* of concurrent operations or initializes and returns a new client.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
acquire(requestTag) {
|
||||
let selectedClient = null;
|
||||
let selectedClientRequestCount = -1;
|
||||
for (const [client, requestCount] of this.activeClients) {
|
||||
// Use the "most-full" client that can still accommodate the request
|
||||
// in order to maximize the number of idle clients as operations start to
|
||||
// complete.
|
||||
if (!this.failedClients.has(client) &&
|
||||
requestCount > selectedClientRequestCount &&
|
||||
requestCount < this.concurrentOperationLimit) {
|
||||
selectedClient = client;
|
||||
selectedClientRequestCount = requestCount;
|
||||
}
|
||||
}
|
||||
if (selectedClient) {
|
||||
logger_1.logger('ClientPool.acquire', requestTag, 'Re-using existing client with %s remaining operations', this.concurrentOperationLimit - selectedClientRequestCount);
|
||||
}
|
||||
else {
|
||||
logger_1.logger('ClientPool.acquire', requestTag, 'Creating a new client');
|
||||
selectedClient = this.clientFactory();
|
||||
selectedClientRequestCount = 0;
|
||||
assert(!this.activeClients.has(selectedClient), 'The provided client factory returned an existing instance');
|
||||
}
|
||||
this.activeClients.set(selectedClient, selectedClientRequestCount + 1);
|
||||
return selectedClient;
|
||||
}
|
||||
/**
|
||||
* Reduces the number of operations for the provided client, potentially
|
||||
* removing it from the pool of active clients.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
async release(requestTag, client) {
|
||||
const requestCount = this.activeClients.get(client) || 0;
|
||||
assert(requestCount > 0, 'No active requests');
|
||||
this.activeClients.set(client, requestCount - 1);
|
||||
if (this.terminated && this.opCount === 0) {
|
||||
this.terminateDeferred.resolve();
|
||||
}
|
||||
if (this.shouldGarbageCollectClient(client)) {
|
||||
this.activeClients.delete(client);
|
||||
this.failedClients.delete(client);
|
||||
await this.clientDestructor(client);
|
||||
logger_1.logger('ClientPool.release', requestTag, 'Garbage collected 1 client');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Given the current operation counts, determines if the given client should
|
||||
* be garbage collected.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
shouldGarbageCollectClient(client) {
|
||||
// Don't garbage collect clients that have active requests.
|
||||
if (this.activeClients.get(client) !== 0) {
|
||||
return false;
|
||||
}
|
||||
// Idle clients that have received RST_STREAM errors are always garbage
|
||||
// collected.
|
||||
if (this.failedClients.has(client)) {
|
||||
return true;
|
||||
}
|
||||
// Otherwise, only garbage collect if we have too much idle capacity (e.g.
|
||||
// more than 100 idle capacity with default settings) .
|
||||
let idleCapacityCount = 0;
|
||||
for (const [, count] of this.activeClients) {
|
||||
idleCapacityCount += this.concurrentOperationLimit - count;
|
||||
}
|
||||
return (idleCapacityCount > this.maxIdleClients * this.concurrentOperationLimit);
|
||||
}
|
||||
/**
|
||||
* The number of currently registered clients.
|
||||
*
|
||||
* @return Number of currently registered clients.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
// Visible for testing.
|
||||
get size() {
|
||||
return this.activeClients.size;
|
||||
}
|
||||
/**
|
||||
* The number of currently active operations.
|
||||
*
|
||||
* @return Number of currently active operations.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
// Visible for testing.
|
||||
get opCount() {
|
||||
let activeOperationCount = 0;
|
||||
this.activeClients.forEach(count => (activeOperationCount += count));
|
||||
return activeOperationCount;
|
||||
}
|
||||
/**
|
||||
* Runs the provided operation in this pool. This function may create an
|
||||
* additional client if all existing clients already operate at the concurrent
|
||||
* operation limit.
|
||||
*
|
||||
* @param requestTag A unique client-assigned identifier for this operation.
|
||||
* @param op A callback function that returns a Promise. The client T will
|
||||
* be returned to the pool when callback finishes.
|
||||
* @return A Promise that resolves with the result of `op`.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
run(requestTag, op) {
|
||||
if (this.terminated) {
|
||||
return Promise.reject(new Error(exports.CLIENT_TERMINATED_ERROR_MSG));
|
||||
}
|
||||
const client = this.acquire(requestTag);
|
||||
return op(client)
|
||||
.catch(async (err) => {
|
||||
var _a;
|
||||
if ((_a = err.message) === null || _a === void 0 ? void 0 : _a.match(/RST_STREAM/)) {
|
||||
// Once a client has seen a RST_STREAM error, the GRPC channel can
|
||||
// no longer be used. We mark the client as failed, which ensures that
|
||||
// we open a new GRPC channel for the next request.
|
||||
this.failedClients.add(client);
|
||||
}
|
||||
await this.release(requestTag, client);
|
||||
return Promise.reject(err);
|
||||
})
|
||||
.then(async (res) => {
|
||||
await this.release(requestTag, client);
|
||||
return res;
|
||||
});
|
||||
}
|
||||
async terminate() {
|
||||
this.terminated = true;
|
||||
// Wait for all pending operations to complete before terminating.
|
||||
if (this.opCount > 0) {
|
||||
logger_1.logger('ClientPool.terminate',
|
||||
/* requestTag= */ null, 'Waiting for %s pending operations to complete before terminating', this.opCount);
|
||||
await this.terminateDeferred.promise;
|
||||
}
|
||||
for (const [client] of this.activeClients) {
|
||||
this.activeClients.delete(client);
|
||||
await this.clientDestructor(client);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.ClientPool = ClientPool;
|
||||
//# sourceMappingURL=pool.js.map
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import * as protos from '../protos/firestore_v1_proto_api';
|
||||
import { Query } from './reference';
|
||||
import { Firestore } from './index';
|
||||
import api = protos.google.firestore.v1;
|
||||
/**
|
||||
* A split point that can be used in a query as a starting and/or end point for
|
||||
* the query results. The cursors returned by {@link #startAt} and {@link
|
||||
* #endBefore} can only be used in a query that matches the constraint of query
|
||||
* that produced this partition.
|
||||
*
|
||||
* @class QueryPartition
|
||||
*/
|
||||
export declare class QueryPartition<T = firestore.DocumentData> implements firestore.QueryPartition<T> {
|
||||
private readonly _firestore;
|
||||
private readonly _collectionId;
|
||||
private readonly _converter;
|
||||
private readonly _startAt;
|
||||
private readonly _endBefore;
|
||||
private readonly _serializer;
|
||||
private _memoizedStartAt;
|
||||
private _memoizedEndBefore;
|
||||
/** @hideconstructor */
|
||||
constructor(_firestore: Firestore, _collectionId: string, _converter: firestore.FirestoreDataConverter<T>, _startAt: api.IValue[] | undefined, _endBefore: api.IValue[] | undefined);
|
||||
/**
|
||||
* The cursor that defines the first result for this partition or `undefined`
|
||||
* if this is the first partition. The cursor value must be
|
||||
* destructured when passed to `startAt()` (for example with
|
||||
* `query.startAt(...queryPartition.startAt)`).
|
||||
*
|
||||
* @example
|
||||
* const query = firestore.collectionGroup('collectionId');
|
||||
* for await (const partition of query.getPartitions(42)) {
|
||||
* let partitionedQuery = query.orderBy(FieldPath.documentId());
|
||||
* if (partition.startAt) {
|
||||
* partitionedQuery = partitionedQuery.startAt(...partition.startAt);
|
||||
* }
|
||||
* if (partition.endBefore) {
|
||||
* partitionedQuery = partitionedQuery.endBefore(...partition.endBefore);
|
||||
* }
|
||||
* const querySnapshot = await partitionedQuery.get();
|
||||
* console.log(`Partition contained ${querySnapshot.length} documents`);
|
||||
* }
|
||||
*
|
||||
* @type {Array<*>}
|
||||
* @return {Array<*>} A cursor value that can be used with {@link
|
||||
* Query#startAt} or `undefined` if this is the first partition.
|
||||
*/
|
||||
get startAt(): unknown[] | undefined;
|
||||
/**
|
||||
* The cursor that defines the first result after this partition or
|
||||
* `undefined` if this is the last partition. The cursor value must be
|
||||
* destructured when passed to `endBefore()` (for example with
|
||||
* `query.endBefore(...queryPartition.endBefore)`).
|
||||
*
|
||||
* @example
|
||||
* const query = firestore.collectionGroup('collectionId');
|
||||
* for await (const partition of query.getPartitions(42)) {
|
||||
* let partitionedQuery = query.orderBy(FieldPath.documentId());
|
||||
* if (partition.startAt) {
|
||||
* partitionedQuery = partitionedQuery.startAt(...partition.startAt);
|
||||
* }
|
||||
* if (partition.endBefore) {
|
||||
* partitionedQuery = partitionedQuery.endBefore(...partition.endBefore);
|
||||
* }
|
||||
* const querySnapshot = await partitionedQuery.get();
|
||||
* console.log(`Partition contained ${querySnapshot.length} documents`);
|
||||
* }
|
||||
*
|
||||
* @type {Array<*>}
|
||||
* @return {Array<*>} A cursor value that can be used with {@link
|
||||
* Query#endBefore} or `undefined` if this is the last partition.
|
||||
*/
|
||||
get endBefore(): unknown[] | undefined;
|
||||
/**
|
||||
* Returns a query that only encapsulates the documents for this partition.
|
||||
*
|
||||
* @example
|
||||
* const query = firestore.collectionGroup('collectionId');
|
||||
* for await (const partition of query.getPartitions(42)) {
|
||||
* const partitionedQuery = partition.toQuery();
|
||||
* const querySnapshot = await partitionedQuery.get();
|
||||
* console.log(`Partition contained ${querySnapshot.length} documents`);
|
||||
* }
|
||||
*
|
||||
* @return {Query<T>} A query partitioned by a {@link Query#startAt} and
|
||||
* {@link Query#endBefore} cursor.
|
||||
*/
|
||||
toQuery(): Query<T>;
|
||||
}
|
||||
+135
@@ -0,0 +1,135 @@
|
||||
"use strict";
|
||||
/*
|
||||
* Copyright 2020 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const reference_1 = require("./reference");
|
||||
const path_1 = require("./path");
|
||||
const serializer_1 = require("./serializer");
|
||||
/**
|
||||
* A split point that can be used in a query as a starting and/or end point for
|
||||
* the query results. The cursors returned by {@link #startAt} and {@link
|
||||
* #endBefore} can only be used in a query that matches the constraint of query
|
||||
* that produced this partition.
|
||||
*
|
||||
* @class QueryPartition
|
||||
*/
|
||||
class QueryPartition {
|
||||
/** @hideconstructor */
|
||||
constructor(_firestore, _collectionId, _converter, _startAt, _endBefore) {
|
||||
this._firestore = _firestore;
|
||||
this._collectionId = _collectionId;
|
||||
this._converter = _converter;
|
||||
this._startAt = _startAt;
|
||||
this._endBefore = _endBefore;
|
||||
this._serializer = new serializer_1.Serializer(_firestore);
|
||||
}
|
||||
/**
|
||||
* The cursor that defines the first result for this partition or `undefined`
|
||||
* if this is the first partition. The cursor value must be
|
||||
* destructured when passed to `startAt()` (for example with
|
||||
* `query.startAt(...queryPartition.startAt)`).
|
||||
*
|
||||
* @example
|
||||
* const query = firestore.collectionGroup('collectionId');
|
||||
* for await (const partition of query.getPartitions(42)) {
|
||||
* let partitionedQuery = query.orderBy(FieldPath.documentId());
|
||||
* if (partition.startAt) {
|
||||
* partitionedQuery = partitionedQuery.startAt(...partition.startAt);
|
||||
* }
|
||||
* if (partition.endBefore) {
|
||||
* partitionedQuery = partitionedQuery.endBefore(...partition.endBefore);
|
||||
* }
|
||||
* const querySnapshot = await partitionedQuery.get();
|
||||
* console.log(`Partition contained ${querySnapshot.length} documents`);
|
||||
* }
|
||||
*
|
||||
* @type {Array<*>}
|
||||
* @return {Array<*>} A cursor value that can be used with {@link
|
||||
* Query#startAt} or `undefined` if this is the first partition.
|
||||
*/
|
||||
get startAt() {
|
||||
if (this._startAt && !this._memoizedStartAt) {
|
||||
this._memoizedStartAt = this._startAt.map(v => this._serializer.decodeValue(v));
|
||||
}
|
||||
return this._memoizedStartAt;
|
||||
}
|
||||
/**
|
||||
* The cursor that defines the first result after this partition or
|
||||
* `undefined` if this is the last partition. The cursor value must be
|
||||
* destructured when passed to `endBefore()` (for example with
|
||||
* `query.endBefore(...queryPartition.endBefore)`).
|
||||
*
|
||||
* @example
|
||||
* const query = firestore.collectionGroup('collectionId');
|
||||
* for await (const partition of query.getPartitions(42)) {
|
||||
* let partitionedQuery = query.orderBy(FieldPath.documentId());
|
||||
* if (partition.startAt) {
|
||||
* partitionedQuery = partitionedQuery.startAt(...partition.startAt);
|
||||
* }
|
||||
* if (partition.endBefore) {
|
||||
* partitionedQuery = partitionedQuery.endBefore(...partition.endBefore);
|
||||
* }
|
||||
* const querySnapshot = await partitionedQuery.get();
|
||||
* console.log(`Partition contained ${querySnapshot.length} documents`);
|
||||
* }
|
||||
*
|
||||
* @type {Array<*>}
|
||||
* @return {Array<*>} A cursor value that can be used with {@link
|
||||
* Query#endBefore} or `undefined` if this is the last partition.
|
||||
*/
|
||||
get endBefore() {
|
||||
if (this._endBefore && !this._memoizedEndBefore) {
|
||||
this._memoizedEndBefore = this._endBefore.map(v => this._serializer.decodeValue(v));
|
||||
}
|
||||
return this._memoizedEndBefore;
|
||||
}
|
||||
/**
|
||||
* Returns a query that only encapsulates the documents for this partition.
|
||||
*
|
||||
* @example
|
||||
* const query = firestore.collectionGroup('collectionId');
|
||||
* for await (const partition of query.getPartitions(42)) {
|
||||
* const partitionedQuery = partition.toQuery();
|
||||
* const querySnapshot = await partitionedQuery.get();
|
||||
* console.log(`Partition contained ${querySnapshot.length} documents`);
|
||||
* }
|
||||
*
|
||||
* @return {Query<T>} A query partitioned by a {@link Query#startAt} and
|
||||
* {@link Query#endBefore} cursor.
|
||||
*/
|
||||
toQuery() {
|
||||
// Since the api.Value to JavaScript type conversion can be lossy (unless
|
||||
// `useBigInt` is used), we pass the original protobuf representation to the
|
||||
// created query.
|
||||
let queryOptions = reference_1.QueryOptions.forCollectionGroupQuery(this._collectionId, this._converter);
|
||||
queryOptions = queryOptions.with({
|
||||
fieldOrders: [new reference_1.FieldOrder(path_1.FieldPath.documentId())],
|
||||
});
|
||||
if (this._startAt !== undefined) {
|
||||
queryOptions = queryOptions.with({
|
||||
startAt: { before: true, values: this._startAt },
|
||||
});
|
||||
}
|
||||
if (this._endBefore !== undefined) {
|
||||
queryOptions = queryOptions.with({
|
||||
endAt: { before: true, values: this._endBefore },
|
||||
});
|
||||
}
|
||||
return new reference_1.Query(this._firestore, queryOptions);
|
||||
}
|
||||
}
|
||||
exports.QueryPartition = QueryPartition;
|
||||
//# sourceMappingURL=query-partition.js.map
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/**
|
||||
* A helper that uses the Token Bucket algorithm to rate limit the number of
|
||||
* operations that can be made in a second.
|
||||
*
|
||||
* Before a given request containing a number of operations can proceed,
|
||||
* RateLimiter determines doing so stays under the provided rate limits. It can
|
||||
* also determine how much time is required before a request can be made.
|
||||
*
|
||||
* RateLimiter can also implement a gradually increasing rate limit. This is
|
||||
* used to enforce the 500/50/5 rule
|
||||
* (https://firebase.google.com/docs/firestore/best-practices#ramping_up_traffic).
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class RateLimiter {
|
||||
private readonly initialCapacity;
|
||||
private readonly multiplier;
|
||||
private readonly multiplierMillis;
|
||||
readonly maximumCapacity: number;
|
||||
private readonly startTimeMillis;
|
||||
availableTokens: number;
|
||||
lastRefillTimeMillis: number;
|
||||
previousCapacity: number;
|
||||
/**
|
||||
* @param initialCapacity Initial maximum number of operations per second.
|
||||
* @param multiplier Rate by which to increase the capacity.
|
||||
* @param multiplierMillis How often the capacity should increase in
|
||||
* milliseconds.
|
||||
* @param maximumCapacity Maximum number of allowed operations per second.
|
||||
* The number of tokens added per second will never exceed this number.
|
||||
* @param startTimeMillis The starting time in epoch milliseconds that the
|
||||
* rate limit is based on. Used for testing the limiter.
|
||||
*/
|
||||
constructor(initialCapacity: number, multiplier: number, multiplierMillis: number, maximumCapacity: number, startTimeMillis?: number);
|
||||
/**
|
||||
* Tries to make the number of operations. Returns true if the request
|
||||
* succeeded and false otherwise.
|
||||
*
|
||||
* @param requestTimeMillis The time used to calculate the number of available
|
||||
* tokens. Used for testing the limiter.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
tryMakeRequest(numOperations: number, requestTimeMillis?: number): boolean;
|
||||
/**
|
||||
* Returns the number of ms needed to make a request with the provided number
|
||||
* of operations. Returns 0 if the request can be made with the existing
|
||||
* capacity. Returns -1 if the request is not possible with the current
|
||||
* capacity.
|
||||
*
|
||||
* @param requestTimeMillis The time used to calculate the number of available
|
||||
* tokens. Used for testing the limiter.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
getNextRequestDelayMs(numOperations: number, requestTimeMillis?: number): number;
|
||||
/**
|
||||
* Refills the number of available tokens based on how much time has elapsed
|
||||
* since the last time the tokens were refilled.
|
||||
*
|
||||
* @param requestTimeMillis The time used to calculate the number of available
|
||||
* tokens. Used for testing the limiter.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private refillTokens;
|
||||
/**
|
||||
* Calculates the maximum capacity based on the provided date.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
calculateCapacity(requestTimeMillis: number): number;
|
||||
}
|
||||
+138
@@ -0,0 +1,138 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/*!
|
||||
* Copyright 2020 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.
|
||||
*/
|
||||
const assert = require("assert");
|
||||
const logger_1 = require("./logger");
|
||||
/**
|
||||
* A helper that uses the Token Bucket algorithm to rate limit the number of
|
||||
* operations that can be made in a second.
|
||||
*
|
||||
* Before a given request containing a number of operations can proceed,
|
||||
* RateLimiter determines doing so stays under the provided rate limits. It can
|
||||
* also determine how much time is required before a request can be made.
|
||||
*
|
||||
* RateLimiter can also implement a gradually increasing rate limit. This is
|
||||
* used to enforce the 500/50/5 rule
|
||||
* (https://firebase.google.com/docs/firestore/best-practices#ramping_up_traffic).
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class RateLimiter {
|
||||
/**
|
||||
* @param initialCapacity Initial maximum number of operations per second.
|
||||
* @param multiplier Rate by which to increase the capacity.
|
||||
* @param multiplierMillis How often the capacity should increase in
|
||||
* milliseconds.
|
||||
* @param maximumCapacity Maximum number of allowed operations per second.
|
||||
* The number of tokens added per second will never exceed this number.
|
||||
* @param startTimeMillis The starting time in epoch milliseconds that the
|
||||
* rate limit is based on. Used for testing the limiter.
|
||||
*/
|
||||
constructor(initialCapacity, multiplier, multiplierMillis, maximumCapacity, startTimeMillis = Date.now()) {
|
||||
this.initialCapacity = initialCapacity;
|
||||
this.multiplier = multiplier;
|
||||
this.multiplierMillis = multiplierMillis;
|
||||
this.maximumCapacity = maximumCapacity;
|
||||
this.startTimeMillis = startTimeMillis;
|
||||
this.availableTokens = initialCapacity;
|
||||
this.lastRefillTimeMillis = startTimeMillis;
|
||||
this.previousCapacity = initialCapacity;
|
||||
}
|
||||
/**
|
||||
* Tries to make the number of operations. Returns true if the request
|
||||
* succeeded and false otherwise.
|
||||
*
|
||||
* @param requestTimeMillis The time used to calculate the number of available
|
||||
* tokens. Used for testing the limiter.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
tryMakeRequest(numOperations, requestTimeMillis = Date.now()) {
|
||||
this.refillTokens(requestTimeMillis);
|
||||
if (numOperations <= this.availableTokens) {
|
||||
this.availableTokens -= numOperations;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Returns the number of ms needed to make a request with the provided number
|
||||
* of operations. Returns 0 if the request can be made with the existing
|
||||
* capacity. Returns -1 if the request is not possible with the current
|
||||
* capacity.
|
||||
*
|
||||
* @param requestTimeMillis The time used to calculate the number of available
|
||||
* tokens. Used for testing the limiter.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
getNextRequestDelayMs(numOperations, requestTimeMillis = Date.now()) {
|
||||
this.refillTokens(requestTimeMillis);
|
||||
if (numOperations < this.availableTokens) {
|
||||
return 0;
|
||||
}
|
||||
const capacity = this.calculateCapacity(requestTimeMillis);
|
||||
if (capacity < numOperations) {
|
||||
return -1;
|
||||
}
|
||||
const requiredTokens = numOperations - this.availableTokens;
|
||||
return Math.ceil((requiredTokens * 1000) / capacity);
|
||||
}
|
||||
/**
|
||||
* Refills the number of available tokens based on how much time has elapsed
|
||||
* since the last time the tokens were refilled.
|
||||
*
|
||||
* @param requestTimeMillis The time used to calculate the number of available
|
||||
* tokens. Used for testing the limiter.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
refillTokens(requestTimeMillis) {
|
||||
if (requestTimeMillis >= this.lastRefillTimeMillis) {
|
||||
const elapsedTime = requestTimeMillis - this.lastRefillTimeMillis;
|
||||
const capacity = this.calculateCapacity(requestTimeMillis);
|
||||
const tokensToAdd = Math.floor((elapsedTime * capacity) / 1000);
|
||||
if (tokensToAdd > 0) {
|
||||
this.availableTokens = Math.min(capacity, this.availableTokens + tokensToAdd);
|
||||
this.lastRefillTimeMillis = requestTimeMillis;
|
||||
}
|
||||
}
|
||||
else {
|
||||
throw new Error('Request time should not be before the last token refill time.');
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Calculates the maximum capacity based on the provided date.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
// Visible for testing.
|
||||
calculateCapacity(requestTimeMillis) {
|
||||
assert(requestTimeMillis >= this.startTimeMillis, 'startTime cannot be after currentTime');
|
||||
const millisElapsed = requestTimeMillis - this.startTimeMillis;
|
||||
const operationsPerSecond = Math.min(Math.floor(Math.pow(this.multiplier, Math.floor(millisElapsed / this.multiplierMillis)) * this.initialCapacity), this.maximumCapacity);
|
||||
if (operationsPerSecond !== this.previousCapacity) {
|
||||
logger_1.logger('RateLimiter.calculateCapacity', null, `New request capacity: ${operationsPerSecond} operations per second.`);
|
||||
}
|
||||
this.previousCapacity = operationsPerSecond;
|
||||
return operationsPerSecond;
|
||||
}
|
||||
}
|
||||
exports.RateLimiter = RateLimiter;
|
||||
//# sourceMappingURL=rate-limiter.js.map
|
||||
+166
@@ -0,0 +1,166 @@
|
||||
/*!
|
||||
* Copyright 2021 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import Firestore, { BulkWriter } from '.';
|
||||
/*!
|
||||
* Datastore allowed numeric IDs where Firestore only allows strings. Numeric
|
||||
* IDs are exposed to Firestore as __idNUM__, so this is the lowest possible
|
||||
* negative numeric value expressed in that format.
|
||||
*
|
||||
* This constant is used to specify startAt/endAt values when querying for all
|
||||
* descendants in a single collection.
|
||||
*/
|
||||
export declare const REFERENCE_NAME_MIN_ID = "__id-9223372036854775808__";
|
||||
/*!
|
||||
* The query limit used for recursive deletes when fetching all descendants of
|
||||
* the specified reference to delete. This is done to prevent the query stream
|
||||
* from streaming documents faster than Firestore can delete.
|
||||
*/
|
||||
export declare const RECURSIVE_DELETE_MAX_PENDING_OPS = 5000;
|
||||
/*!
|
||||
* The number of pending BulkWriter operations at which RecursiveDelete
|
||||
* starts the next limit query to fetch descendants. By starting the query
|
||||
* while there are pending operations, Firestore can improve BulkWriter
|
||||
* throughput. This helps prevent BulkWriter from idling while Firestore
|
||||
* fetches the next query.
|
||||
*/
|
||||
export declare const RECURSIVE_DELETE_MIN_PENDING_OPS = 1000;
|
||||
/**
|
||||
* Class used to store state required for running a recursive delete operation.
|
||||
* Each recursive delete call should use a new instance of the class.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class RecursiveDelete {
|
||||
private readonly firestore;
|
||||
private readonly writer;
|
||||
private readonly ref;
|
||||
private readonly maxLimit;
|
||||
private readonly minLimit;
|
||||
/**
|
||||
* The number of deletes that failed with a permanent error.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private errorCount;
|
||||
/**
|
||||
* The most recently thrown error. Used to populate the developer-facing
|
||||
* error message when the recursive delete operation completes.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private lastError;
|
||||
/**
|
||||
* Whether there are still documents to delete that still need to be fetched.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private documentsPending;
|
||||
/**
|
||||
* Whether run() has been called.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private started;
|
||||
/**
|
||||
* Query limit to use when fetching all descendants.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private readonly maxPendingOps;
|
||||
/**
|
||||
* The number of pending BulkWriter operations at which RecursiveDelete
|
||||
* starts the next limit query to fetch descendants.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private readonly minPendingOps;
|
||||
/**
|
||||
* A deferred promise that resolves when the recursive delete operation
|
||||
* is completed.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private readonly completionDeferred;
|
||||
/**
|
||||
* Whether a query stream is currently in progress. Only one stream can be
|
||||
* run at a time.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private streamInProgress;
|
||||
/**
|
||||
* The last document snapshot returned by the stream. Used to set the
|
||||
* startAfter() field in the subsequent stream.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private lastDocumentSnap;
|
||||
/**
|
||||
* The number of pending BulkWriter operations. Used to determine when the
|
||||
* next query can be run.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private pendingOpsCount;
|
||||
private errorStack;
|
||||
/**
|
||||
*
|
||||
* @param firestore The Firestore instance to use.
|
||||
* @param writer The BulkWriter instance to use for delete operations.
|
||||
* @param ref The document or collection reference to recursively delete.
|
||||
* @param maxLimit The query limit to use when fetching descendants
|
||||
* @param minLimit The number of pending BulkWriter operations at which
|
||||
* RecursiveDelete starts the next limit query to fetch descendants.
|
||||
*/
|
||||
constructor(firestore: Firestore, writer: BulkWriter, ref: firestore.CollectionReference<unknown> | firestore.DocumentReference<unknown>, maxLimit: number, minLimit: number);
|
||||
/**
|
||||
* Recursively deletes the reference provided in the class constructor.
|
||||
* Returns a promise that resolves when all descendants have been deleted, or
|
||||
* if an error occurs.
|
||||
*/
|
||||
run(): Promise<void>;
|
||||
/**
|
||||
* Creates a query stream and attaches event handlers to it.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private setupStream;
|
||||
/**
|
||||
* Retrieves all descendant documents nested under the provided reference.
|
||||
* @param ref The reference to fetch all descendants for.
|
||||
* @private
|
||||
* @internal
|
||||
* @return {Stream<QueryDocumentSnapshot>} Stream of descendant documents.
|
||||
*/
|
||||
private getAllDescendants;
|
||||
/**
|
||||
* Called when all descendants of the provided reference have been streamed
|
||||
* or if a permanent error occurs during the stream. Deletes the developer
|
||||
* provided reference and wraps any errors that occurred.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private onQueryEnd;
|
||||
/**
|
||||
* Deletes the provided reference and starts the next stream if conditions
|
||||
* are met.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
private deleteRef;
|
||||
private incrementErrorCount;
|
||||
}
|
||||
+250
@@ -0,0 +1,250 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const assert = require("assert");
|
||||
const _1 = require(".");
|
||||
const util_1 = require("./util");
|
||||
const reference_1 = require("./reference");
|
||||
/*!
|
||||
* Datastore allowed numeric IDs where Firestore only allows strings. Numeric
|
||||
* IDs are exposed to Firestore as __idNUM__, so this is the lowest possible
|
||||
* negative numeric value expressed in that format.
|
||||
*
|
||||
* This constant is used to specify startAt/endAt values when querying for all
|
||||
* descendants in a single collection.
|
||||
*/
|
||||
exports.REFERENCE_NAME_MIN_ID = '__id-9223372036854775808__';
|
||||
/*!
|
||||
* The query limit used for recursive deletes when fetching all descendants of
|
||||
* the specified reference to delete. This is done to prevent the query stream
|
||||
* from streaming documents faster than Firestore can delete.
|
||||
*/
|
||||
// Visible for testing.
|
||||
exports.RECURSIVE_DELETE_MAX_PENDING_OPS = 5000;
|
||||
/*!
|
||||
* The number of pending BulkWriter operations at which RecursiveDelete
|
||||
* starts the next limit query to fetch descendants. By starting the query
|
||||
* while there are pending operations, Firestore can improve BulkWriter
|
||||
* throughput. This helps prevent BulkWriter from idling while Firestore
|
||||
* fetches the next query.
|
||||
*/
|
||||
exports.RECURSIVE_DELETE_MIN_PENDING_OPS = 1000;
|
||||
/**
|
||||
* Class used to store state required for running a recursive delete operation.
|
||||
* Each recursive delete call should use a new instance of the class.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class RecursiveDelete {
|
||||
/**
|
||||
*
|
||||
* @param firestore The Firestore instance to use.
|
||||
* @param writer The BulkWriter instance to use for delete operations.
|
||||
* @param ref The document or collection reference to recursively delete.
|
||||
* @param maxLimit The query limit to use when fetching descendants
|
||||
* @param minLimit The number of pending BulkWriter operations at which
|
||||
* RecursiveDelete starts the next limit query to fetch descendants.
|
||||
*/
|
||||
constructor(firestore, writer, ref, maxLimit, minLimit) {
|
||||
this.firestore = firestore;
|
||||
this.writer = writer;
|
||||
this.ref = ref;
|
||||
this.maxLimit = maxLimit;
|
||||
this.minLimit = minLimit;
|
||||
/**
|
||||
* The number of deletes that failed with a permanent error.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this.errorCount = 0;
|
||||
/**
|
||||
* Whether there are still documents to delete that still need to be fetched.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this.documentsPending = true;
|
||||
/**
|
||||
* Whether run() has been called.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this.started = false;
|
||||
/**
|
||||
* A deferred promise that resolves when the recursive delete operation
|
||||
* is completed.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this.completionDeferred = new util_1.Deferred();
|
||||
/**
|
||||
* Whether a query stream is currently in progress. Only one stream can be
|
||||
* run at a time.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this.streamInProgress = false;
|
||||
/**
|
||||
* The number of pending BulkWriter operations. Used to determine when the
|
||||
* next query can be run.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
this.pendingOpsCount = 0;
|
||||
this.errorStack = '';
|
||||
this.maxPendingOps = maxLimit;
|
||||
this.minPendingOps = minLimit;
|
||||
}
|
||||
/**
|
||||
* Recursively deletes the reference provided in the class constructor.
|
||||
* Returns a promise that resolves when all descendants have been deleted, or
|
||||
* if an error occurs.
|
||||
*/
|
||||
run() {
|
||||
assert(!this.started, 'RecursiveDelete.run() should only be called once.');
|
||||
// Capture the error stack to preserve stack tracing across async calls.
|
||||
this.errorStack = Error().stack;
|
||||
this.writer._verifyNotClosed();
|
||||
this.setupStream();
|
||||
return this.completionDeferred.promise;
|
||||
}
|
||||
/**
|
||||
* Creates a query stream and attaches event handlers to it.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
setupStream() {
|
||||
const stream = this.getAllDescendants(this.ref instanceof _1.CollectionReference
|
||||
? this.ref
|
||||
: this.ref);
|
||||
this.streamInProgress = true;
|
||||
let streamedDocsCount = 0;
|
||||
stream
|
||||
.on('error', err => {
|
||||
err.code = 14 /* UNAVAILABLE */;
|
||||
err.stack = 'Failed to fetch children documents: ' + err.stack;
|
||||
this.lastError = err;
|
||||
this.onQueryEnd();
|
||||
})
|
||||
.on('data', (snap) => {
|
||||
streamedDocsCount++;
|
||||
this.lastDocumentSnap = snap;
|
||||
this.deleteRef(snap.ref);
|
||||
})
|
||||
.on('end', () => {
|
||||
this.streamInProgress = false;
|
||||
// If there are fewer than the number of documents specified in the
|
||||
// limit() field, we know that the query is complete.
|
||||
if (streamedDocsCount < this.minPendingOps) {
|
||||
this.onQueryEnd();
|
||||
}
|
||||
else if (this.pendingOpsCount === 0) {
|
||||
this.setupStream();
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Retrieves all descendant documents nested under the provided reference.
|
||||
* @param ref The reference to fetch all descendants for.
|
||||
* @private
|
||||
* @internal
|
||||
* @return {Stream<QueryDocumentSnapshot>} Stream of descendant documents.
|
||||
*/
|
||||
getAllDescendants(ref) {
|
||||
// The parent is the closest ancestor document to the location we're
|
||||
// deleting. If we are deleting a document, the parent is the path of that
|
||||
// document. If we are deleting a collection, the parent is the path of the
|
||||
// document containing that collection (or the database root, if it is a
|
||||
// root collection).
|
||||
let parentPath = ref._resourcePath;
|
||||
if (ref instanceof _1.CollectionReference) {
|
||||
parentPath = parentPath.popLast();
|
||||
}
|
||||
const collectionId = ref instanceof _1.CollectionReference
|
||||
? ref.id
|
||||
: ref.parent.id;
|
||||
let query = new _1.Query(this.firestore, reference_1.QueryOptions.forKindlessAllDescendants(parentPath, collectionId,
|
||||
/* requireConsistency= */ false));
|
||||
// Query for names only to fetch empty snapshots.
|
||||
query = query.select(_1.FieldPath.documentId()).limit(this.maxPendingOps);
|
||||
if (ref instanceof _1.CollectionReference) {
|
||||
// To find all descendants of a collection reference, we need to use a
|
||||
// composite filter that captures all documents that start with the
|
||||
// collection prefix. The MIN_KEY constant represents the minimum key in
|
||||
// this collection, and a null byte + the MIN_KEY represents the minimum
|
||||
// key is the next possible collection.
|
||||
const nullChar = String.fromCharCode(0);
|
||||
const startAt = collectionId + '/' + exports.REFERENCE_NAME_MIN_ID;
|
||||
const endAt = collectionId + nullChar + '/' + exports.REFERENCE_NAME_MIN_ID;
|
||||
query = query
|
||||
.where(_1.FieldPath.documentId(), '>=', startAt)
|
||||
.where(_1.FieldPath.documentId(), '<', endAt);
|
||||
}
|
||||
if (this.lastDocumentSnap) {
|
||||
query = query.startAfter(this.lastDocumentSnap);
|
||||
}
|
||||
return query.stream();
|
||||
}
|
||||
/**
|
||||
* Called when all descendants of the provided reference have been streamed
|
||||
* or if a permanent error occurs during the stream. Deletes the developer
|
||||
* provided reference and wraps any errors that occurred.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
onQueryEnd() {
|
||||
this.documentsPending = false;
|
||||
if (this.ref instanceof _1.DocumentReference) {
|
||||
this.writer.delete(this.ref).catch(err => this.incrementErrorCount(err));
|
||||
}
|
||||
this.writer.flush().then(async () => {
|
||||
var _a;
|
||||
if (this.lastError === undefined) {
|
||||
this.completionDeferred.resolve();
|
||||
}
|
||||
else {
|
||||
let error = new (require('google-gax').GoogleError)(`${this.errorCount} ` +
|
||||
`${this.errorCount !== 1 ? 'deletes' : 'delete'} ` +
|
||||
'failed. The last delete failed with: ');
|
||||
if (this.lastError.code !== undefined) {
|
||||
error.code = this.lastError.code;
|
||||
}
|
||||
error = util_1.wrapError(error, this.errorStack);
|
||||
// Wrap the BulkWriter error last to provide the full stack trace.
|
||||
this.completionDeferred.reject(this.lastError.stack
|
||||
? util_1.wrapError(error, (_a = this.lastError.stack) !== null && _a !== void 0 ? _a : '')
|
||||
: error);
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Deletes the provided reference and starts the next stream if conditions
|
||||
* are met.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
deleteRef(docRef) {
|
||||
this.pendingOpsCount++;
|
||||
this.writer
|
||||
.delete(docRef)
|
||||
.catch(err => {
|
||||
this.incrementErrorCount(err);
|
||||
})
|
||||
.then(() => {
|
||||
this.pendingOpsCount--;
|
||||
// We wait until the previous stream has ended in order to sure the
|
||||
// startAfter document is correct. Starting the next stream while
|
||||
// there are pending operations allows Firestore to maximize
|
||||
// BulkWriter throughput.
|
||||
if (this.documentsPending &&
|
||||
!this.streamInProgress &&
|
||||
this.pendingOpsCount < this.minPendingOps) {
|
||||
this.setupStream();
|
||||
}
|
||||
});
|
||||
}
|
||||
incrementErrorCount(err) {
|
||||
this.errorCount++;
|
||||
this.lastError = err;
|
||||
}
|
||||
}
|
||||
exports.RecursiveDelete = RecursiveDelete;
|
||||
//# sourceMappingURL=recursive-delete.js.map
|
||||
+1185
File diff suppressed because it is too large
Load Diff
+2264
File diff suppressed because it is too large
Load Diff
+86
@@ -0,0 +1,86 @@
|
||||
/*!
|
||||
* Copyright 2019 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { DocumentData } from '@google-cloud/firestore';
|
||||
import * as proto from '../protos/firestore_v1_proto_api';
|
||||
import { Firestore } from './index';
|
||||
import { FieldPath } from './path';
|
||||
import { ApiMapValue, ValidationOptions } from './types';
|
||||
import api = proto.google.firestore.v1;
|
||||
/**
|
||||
* An interface for Firestore types that can be serialized to Protobuf.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export interface Serializable {
|
||||
toProto(): api.IValue;
|
||||
}
|
||||
/**
|
||||
* Serializer that is used to convert between JavaScript types and their
|
||||
* Firestore Protobuf representation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class Serializer {
|
||||
private allowUndefined;
|
||||
private createReference;
|
||||
private createInteger;
|
||||
constructor(firestore: Firestore);
|
||||
/**
|
||||
* Encodes a JavaScript object into the Firestore 'Fields' representation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param obj The object to encode.
|
||||
* @returns The Firestore 'Fields' representation
|
||||
*/
|
||||
encodeFields(obj: DocumentData): ApiMapValue;
|
||||
/**
|
||||
* Encodes a JavaScript value into the Firestore 'Value' representation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param val The object to encode
|
||||
* @returns The Firestore Proto or null if we are deleting a field.
|
||||
*/
|
||||
encodeValue(val: unknown): api.IValue | null;
|
||||
/**
|
||||
* Decodes a single Firestore 'Value' Protobuf.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param proto A Firestore 'Value' Protobuf.
|
||||
* @returns The converted JS type.
|
||||
*/
|
||||
decodeValue(proto: api.IValue): unknown;
|
||||
}
|
||||
/**
|
||||
* Validates a JavaScript value for usage as a Firestore value.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param value JavaScript value to validate.
|
||||
* @param desc A description of the expected type.
|
||||
* @param path The field path to validate.
|
||||
* @param options Validation options
|
||||
* @param level The current depth of the traversal. This is used to decide
|
||||
* whether undefined values or deletes are allowed.
|
||||
* @param inArray Whether we are inside an array.
|
||||
* @throws when the object is invalid.
|
||||
*/
|
||||
export declare function validateUserInput(arg: string | number, value: unknown, desc: string, options: ValidationOptions, path?: FieldPath, level?: number, inArray?: boolean): void;
|
||||
+348
@@ -0,0 +1,348 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2019 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const convert_1 = require("./convert");
|
||||
const field_value_1 = require("./field-value");
|
||||
const geo_point_1 = require("./geo-point");
|
||||
const index_1 = require("./index");
|
||||
const path_1 = require("./path");
|
||||
const timestamp_1 = require("./timestamp");
|
||||
const util_1 = require("./util");
|
||||
const validate_1 = require("./validate");
|
||||
/**
|
||||
* The maximum depth of a Firestore object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
const MAX_DEPTH = 20;
|
||||
/**
|
||||
* Serializer that is used to convert between JavaScript types and their
|
||||
* Firestore Protobuf representation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class Serializer {
|
||||
constructor(firestore) {
|
||||
// Instead of storing the `firestore` object, we store just a reference to
|
||||
// its `.doc()` method. This avoid a circular reference, which breaks
|
||||
// JSON.stringify().
|
||||
this.createReference = path => firestore.doc(path);
|
||||
this.createInteger = n => firestore._settings.useBigInt ? BigInt(n) : Number(n);
|
||||
this.allowUndefined = !!firestore._settings.ignoreUndefinedProperties;
|
||||
}
|
||||
/**
|
||||
* Encodes a JavaScript object into the Firestore 'Fields' representation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param obj The object to encode.
|
||||
* @returns The Firestore 'Fields' representation
|
||||
*/
|
||||
encodeFields(obj) {
|
||||
const fields = {};
|
||||
for (const prop of Object.keys(obj)) {
|
||||
const val = this.encodeValue(obj[prop]);
|
||||
if (val) {
|
||||
fields[prop] = val;
|
||||
}
|
||||
}
|
||||
return fields;
|
||||
}
|
||||
/**
|
||||
* Encodes a JavaScript value into the Firestore 'Value' representation.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param val The object to encode
|
||||
* @returns The Firestore Proto or null if we are deleting a field.
|
||||
*/
|
||||
encodeValue(val) {
|
||||
if (val instanceof field_value_1.FieldTransform) {
|
||||
return null;
|
||||
}
|
||||
if (typeof val === 'string') {
|
||||
return {
|
||||
stringValue: val,
|
||||
};
|
||||
}
|
||||
if (typeof val === 'boolean') {
|
||||
return {
|
||||
booleanValue: val,
|
||||
};
|
||||
}
|
||||
if (typeof val === 'number') {
|
||||
if (Number.isSafeInteger(val)) {
|
||||
return {
|
||||
integerValue: val,
|
||||
};
|
||||
}
|
||||
else {
|
||||
return {
|
||||
doubleValue: val,
|
||||
};
|
||||
}
|
||||
}
|
||||
if (typeof val === 'bigint') {
|
||||
return {
|
||||
integerValue: val.toString(),
|
||||
};
|
||||
}
|
||||
if (val instanceof Date) {
|
||||
const timestamp = timestamp_1.Timestamp.fromDate(val);
|
||||
return {
|
||||
timestampValue: {
|
||||
seconds: timestamp.seconds,
|
||||
nanos: timestamp.nanoseconds,
|
||||
},
|
||||
};
|
||||
}
|
||||
if (isMomentJsType(val)) {
|
||||
const timestamp = timestamp_1.Timestamp.fromDate(val.toDate());
|
||||
return {
|
||||
timestampValue: {
|
||||
seconds: timestamp.seconds,
|
||||
nanos: timestamp.nanoseconds,
|
||||
},
|
||||
};
|
||||
}
|
||||
if (val === null) {
|
||||
return {
|
||||
nullValue: 'NULL_VALUE',
|
||||
};
|
||||
}
|
||||
if (val instanceof Buffer || val instanceof Uint8Array) {
|
||||
return {
|
||||
bytesValue: val,
|
||||
};
|
||||
}
|
||||
if (util_1.isObject(val)) {
|
||||
const toProto = val['toProto'];
|
||||
if (typeof toProto === 'function') {
|
||||
return toProto.bind(val)();
|
||||
}
|
||||
}
|
||||
if (Array.isArray(val)) {
|
||||
const array = {
|
||||
arrayValue: {},
|
||||
};
|
||||
if (val.length > 0) {
|
||||
array.arrayValue.values = [];
|
||||
for (let i = 0; i < val.length; ++i) {
|
||||
const enc = this.encodeValue(val[i]);
|
||||
if (enc) {
|
||||
array.arrayValue.values.push(enc);
|
||||
}
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
if (typeof val === 'object' && util_1.isPlainObject(val)) {
|
||||
const map = {
|
||||
mapValue: {},
|
||||
};
|
||||
// If we encounter an empty object, we always need to send it to make sure
|
||||
// the server creates a map entry.
|
||||
if (!util_1.isEmpty(val)) {
|
||||
map.mapValue.fields = this.encodeFields(val);
|
||||
if (util_1.isEmpty(map.mapValue.fields)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
if (val === undefined && this.allowUndefined) {
|
||||
return null;
|
||||
}
|
||||
throw new Error(`Cannot encode value: ${val}`);
|
||||
}
|
||||
/**
|
||||
* Decodes a single Firestore 'Value' Protobuf.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param proto A Firestore 'Value' Protobuf.
|
||||
* @returns The converted JS type.
|
||||
*/
|
||||
decodeValue(proto) {
|
||||
const valueType = convert_1.detectValueType(proto);
|
||||
switch (valueType) {
|
||||
case 'stringValue': {
|
||||
return proto.stringValue;
|
||||
}
|
||||
case 'booleanValue': {
|
||||
return proto.booleanValue;
|
||||
}
|
||||
case 'integerValue': {
|
||||
return this.createInteger(proto.integerValue);
|
||||
}
|
||||
case 'doubleValue': {
|
||||
return proto.doubleValue;
|
||||
}
|
||||
case 'timestampValue': {
|
||||
return timestamp_1.Timestamp.fromProto(proto.timestampValue);
|
||||
}
|
||||
case 'referenceValue': {
|
||||
const resourcePath = path_1.QualifiedResourcePath.fromSlashSeparatedString(proto.referenceValue);
|
||||
return this.createReference(resourcePath.relativeName);
|
||||
}
|
||||
case 'arrayValue': {
|
||||
const array = [];
|
||||
if (Array.isArray(proto.arrayValue.values)) {
|
||||
for (const value of proto.arrayValue.values) {
|
||||
array.push(this.decodeValue(value));
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
case 'nullValue': {
|
||||
return null;
|
||||
}
|
||||
case 'mapValue': {
|
||||
const obj = {};
|
||||
const fields = proto.mapValue.fields;
|
||||
if (fields) {
|
||||
for (const prop of Object.keys(fields)) {
|
||||
obj[prop] = this.decodeValue(fields[prop]);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
case 'geoPointValue': {
|
||||
return geo_point_1.GeoPoint.fromProto(proto.geoPointValue);
|
||||
}
|
||||
case 'bytesValue': {
|
||||
return proto.bytesValue;
|
||||
}
|
||||
default: {
|
||||
throw new Error('Cannot decode type from Firestore Value: ' + JSON.stringify(proto));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.Serializer = Serializer;
|
||||
/**
|
||||
* Validates a JavaScript value for usage as a Firestore value.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param value JavaScript value to validate.
|
||||
* @param desc A description of the expected type.
|
||||
* @param path The field path to validate.
|
||||
* @param options Validation options
|
||||
* @param level The current depth of the traversal. This is used to decide
|
||||
* whether undefined values or deletes are allowed.
|
||||
* @param inArray Whether we are inside an array.
|
||||
* @throws when the object is invalid.
|
||||
*/
|
||||
function validateUserInput(arg, value, desc, options, path, level, inArray) {
|
||||
if (path && path.size > MAX_DEPTH) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} Input object is deeper than ${MAX_DEPTH} levels or contains a cycle.`);
|
||||
}
|
||||
level = level || 0;
|
||||
inArray = inArray || false;
|
||||
const fieldPathMessage = path ? ` (found in field "${path}")` : '';
|
||||
if (Array.isArray(value)) {
|
||||
for (let i = 0; i < value.length; ++i) {
|
||||
validateUserInput(arg, value[i], desc, options, path ? path.append(String(i)) : new path_1.FieldPath(String(i)), level + 1,
|
||||
/* inArray= */ true);
|
||||
}
|
||||
}
|
||||
else if (util_1.isPlainObject(value)) {
|
||||
for (const prop of Object.keys(value)) {
|
||||
validateUserInput(arg, value[prop], desc, options, path ? path.append(new path_1.FieldPath(prop)) : new path_1.FieldPath(prop), level + 1, inArray);
|
||||
}
|
||||
}
|
||||
else if (value === undefined) {
|
||||
if (options.allowUndefined && level === 0) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} "undefined" values are only ignored inside of objects.`);
|
||||
}
|
||||
else if (!options.allowUndefined) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} Cannot use "undefined" as a Firestore value${fieldPathMessage}. ` +
|
||||
'If you want to ignore undefined values, enable `ignoreUndefinedProperties`.');
|
||||
}
|
||||
}
|
||||
else if (value instanceof field_value_1.DeleteTransform) {
|
||||
if (inArray) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} ${value.methodName}() cannot be used inside of an array${fieldPathMessage}.`);
|
||||
}
|
||||
else if (options.allowDeletes === 'none') {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} ${value.methodName}() must appear at the top-level and can only be used in update() ` +
|
||||
`or set() with {merge:true}${fieldPathMessage}.`);
|
||||
}
|
||||
else if (options.allowDeletes === 'root') {
|
||||
if (level === 0) {
|
||||
// Ok (update() with UpdateData).
|
||||
}
|
||||
else if (level === 1 && (path === null || path === void 0 ? void 0 : path.size) === 1) {
|
||||
// Ok (update with varargs).
|
||||
}
|
||||
else {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} ${value.methodName}() must appear at the top-level and can only be used in update() ` +
|
||||
`or set() with {merge:true}${fieldPathMessage}.`);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (value instanceof field_value_1.FieldTransform) {
|
||||
if (inArray) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} ${value.methodName}() cannot be used inside of an array${fieldPathMessage}.`);
|
||||
}
|
||||
else if (!options.allowTransforms) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} ${value.methodName}() can only be used in set(), create() or update()${fieldPathMessage}.`);
|
||||
}
|
||||
}
|
||||
else if (value instanceof path_1.FieldPath) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, desc)} Cannot use object of type "FieldPath" as a Firestore value${fieldPathMessage}.`);
|
||||
}
|
||||
else if (value instanceof index_1.DocumentReference) {
|
||||
// Ok.
|
||||
}
|
||||
else if (value instanceof geo_point_1.GeoPoint) {
|
||||
// Ok.
|
||||
}
|
||||
else if (value instanceof timestamp_1.Timestamp || value instanceof Date) {
|
||||
// Ok.
|
||||
}
|
||||
else if (isMomentJsType(value)) {
|
||||
// Ok.
|
||||
}
|
||||
else if (value instanceof Buffer || value instanceof Uint8Array) {
|
||||
// Ok.
|
||||
}
|
||||
else if (value === null) {
|
||||
// Ok.
|
||||
}
|
||||
else if (typeof value === 'object') {
|
||||
throw new Error(validate_1.customObjectMessage(arg, value, path));
|
||||
}
|
||||
}
|
||||
exports.validateUserInput = validateUserInput;
|
||||
/**
|
||||
* Returns true if value is a MomentJs date object.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function isMomentJsType(value) {
|
||||
return (typeof value === 'object' &&
|
||||
value !== null &&
|
||||
value.constructor &&
|
||||
value.constructor.name === 'Moment' &&
|
||||
typeof value.toDate === 'function');
|
||||
}
|
||||
//# sourceMappingURL=serializer.js.map
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Copyright 2021 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.
|
||||
*/
|
||||
/**
|
||||
* Internal copy of GRPC status code. Copied to prevent loading of google-gax
|
||||
* at SDK startup.
|
||||
*/
|
||||
export declare const enum StatusCode {
|
||||
OK = 0,
|
||||
CANCELLED = 1,
|
||||
UNKNOWN = 2,
|
||||
INVALID_ARGUMENT = 3,
|
||||
DEADLINE_EXCEEDED = 4,
|
||||
NOT_FOUND = 5,
|
||||
ALREADY_EXISTS = 6,
|
||||
PERMISSION_DENIED = 7,
|
||||
RESOURCE_EXHAUSTED = 8,
|
||||
FAILED_PRECONDITION = 9,
|
||||
ABORTED = 10,
|
||||
OUT_OF_RANGE = 11,
|
||||
UNIMPLEMENTED = 12,
|
||||
INTERNAL = 13,
|
||||
UNAVAILABLE = 14,
|
||||
DATA_LOSS = 15,
|
||||
UNAUTHENTICATED = 16
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2021 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=status-code.js.map
|
||||
+188
@@ -0,0 +1,188 @@
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { google } from '../protos/firestore_v1_proto_api';
|
||||
import api = google.firestore.v1;
|
||||
/**
|
||||
* A Timestamp represents a point in time independent of any time zone or
|
||||
* calendar, represented as seconds and fractions of seconds at nanosecond
|
||||
* resolution in UTC Epoch time. It is encoded using the Proleptic Gregorian
|
||||
* Calendar which extends the Gregorian calendar backwards to year one. It is
|
||||
* encoded assuming all minutes are 60 seconds long, i.e. leap seconds are
|
||||
* "smeared" so that no leap second table is needed for interpretation. Range is
|
||||
* from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
|
||||
*
|
||||
* @see https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto
|
||||
*/
|
||||
export declare class Timestamp implements firestore.Timestamp {
|
||||
private readonly _seconds;
|
||||
private readonly _nanoseconds;
|
||||
/**
|
||||
* Creates a new timestamp with the current date, with millisecond precision.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({ updateTime:Firestore.Timestamp.now() });
|
||||
*
|
||||
* @return {Timestamp} A new `Timestamp` representing the current date.
|
||||
*/
|
||||
static now(): Timestamp;
|
||||
/**
|
||||
* Creates a new timestamp from the given date.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* let date = Date.parse('01 Jan 2000 00:00:00 GMT');
|
||||
* documentRef.set({ startTime:Firestore.Timestamp.fromDate(date) });
|
||||
*
|
||||
* @param {Date} date The date to initialize the `Timestamp` from.
|
||||
* @return {Timestamp} A new `Timestamp` representing the same point in time
|
||||
* as the given date.
|
||||
*/
|
||||
static fromDate(date: Date): Timestamp;
|
||||
/**
|
||||
* Creates a new timestamp from the given number of milliseconds.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({ startTime:Firestore.Timestamp.fromMillis(42) });
|
||||
*
|
||||
* @param {number} milliseconds Number of milliseconds since Unix epoch
|
||||
* 1970-01-01T00:00:00Z.
|
||||
* @return {Timestamp} A new `Timestamp` representing the same point in time
|
||||
* as the given number of milliseconds.
|
||||
*/
|
||||
static fromMillis(milliseconds: number): Timestamp;
|
||||
/**
|
||||
* Generates a `Timestamp` object from a Timestamp proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param {Object} timestamp The `Timestamp` Protobuf object.
|
||||
*/
|
||||
static fromProto(timestamp: google.protobuf.ITimestamp): Timestamp;
|
||||
/**
|
||||
* Creates a new timestamp.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({ startTime:new Firestore.Timestamp(42, 0) });
|
||||
*
|
||||
* @param {number} seconds The number of seconds of UTC time since Unix epoch
|
||||
* 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
|
||||
* 9999-12-31T23:59:59Z inclusive.
|
||||
* @param {number} nanoseconds The non-negative fractions of a second at
|
||||
* nanosecond resolution. Negative second values with fractions must still
|
||||
* have non-negative nanoseconds values that count forward in time. Must be
|
||||
* from 0 to 999,999,999 inclusive.
|
||||
*/
|
||||
constructor(seconds: number, nanoseconds: number);
|
||||
/**
|
||||
* The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* let updated = snap.updateTime;
|
||||
* console.log(`Updated at ${updated.seconds}s ${updated.nanoseconds}ns`);
|
||||
* });
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
get seconds(): number;
|
||||
/**
|
||||
* The non-negative fractions of a second at nanosecond resolution.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* let updated = snap.updateTime;
|
||||
* console.log(`Updated at ${updated.seconds}s ${updated.nanoseconds}ns`);
|
||||
* });
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
get nanoseconds(): number;
|
||||
/**
|
||||
* Returns a new `Date` corresponding to this timestamp. This may lose
|
||||
* precision.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* console.log(`Document updated at: ${snap.updateTime.toDate()}`);
|
||||
* });
|
||||
*
|
||||
* @return {Date} JavaScript `Date` object representing the same point in time
|
||||
* as this `Timestamp`, with millisecond precision.
|
||||
*/
|
||||
toDate(): Date;
|
||||
/**
|
||||
* Returns the number of milliseconds since Unix epoch 1970-01-01T00:00:00Z.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* let startTime = snap.get('startTime');
|
||||
* let endTime = snap.get('endTime');
|
||||
* console.log(`Duration: ${endTime - startTime}`);
|
||||
* });
|
||||
*
|
||||
* @return {number} The point in time corresponding to this timestamp,
|
||||
* represented as the number of milliseconds since Unix epoch
|
||||
* 1970-01-01T00:00:00Z.
|
||||
*/
|
||||
toMillis(): number;
|
||||
/**
|
||||
* Returns 'true' if this `Timestamp` is equal to the provided one.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* if (snap.createTime.isEqual(snap.updateTime)) {
|
||||
* console.log('Document is in its initial state.');
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* @param {any} other The `Timestamp` to compare against.
|
||||
* @return {boolean} 'true' if this `Timestamp` is equal to the provided one.
|
||||
*/
|
||||
isEqual(other: firestore.Timestamp): boolean;
|
||||
/**
|
||||
* Generates the Protobuf `Timestamp` object for this timestamp.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns {Object} The `Timestamp` Protobuf object.
|
||||
*/
|
||||
toProto(): api.IValue;
|
||||
/**
|
||||
* Converts this object to a primitive `string`, which allows `Timestamp` objects to be compared
|
||||
* using the `>`, `<=`, `>=` and `>` operators.
|
||||
*
|
||||
* @return {string} a string encoding of this object.
|
||||
*/
|
||||
valueOf(): string;
|
||||
}
|
||||
+265
@@ -0,0 +1,265 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const validate_1 = require("./validate");
|
||||
/*!
|
||||
* Number of nanoseconds in a millisecond.
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
const MS_TO_NANOS = 1000000;
|
||||
/*!
|
||||
* The minimum legal value for the "seconds" property of a Timestamp object.
|
||||
*
|
||||
* This value corresponds to 0001-01-01T00:00:00Z.
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
const MIN_SECONDS = -62135596800;
|
||||
/*!
|
||||
* The maximum legal value for the "seconds" property of a Timestamp object.
|
||||
*
|
||||
* This value corresponds to 9999-12-31T23:59:59.999999999Z.
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
const MAX_SECONDS = 253402300799;
|
||||
/**
|
||||
* A Timestamp represents a point in time independent of any time zone or
|
||||
* calendar, represented as seconds and fractions of seconds at nanosecond
|
||||
* resolution in UTC Epoch time. It is encoded using the Proleptic Gregorian
|
||||
* Calendar which extends the Gregorian calendar backwards to year one. It is
|
||||
* encoded assuming all minutes are 60 seconds long, i.e. leap seconds are
|
||||
* "smeared" so that no leap second table is needed for interpretation. Range is
|
||||
* from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
|
||||
*
|
||||
* @see https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto
|
||||
*/
|
||||
class Timestamp {
|
||||
/**
|
||||
* Creates a new timestamp.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({ startTime:new Firestore.Timestamp(42, 0) });
|
||||
*
|
||||
* @param {number} seconds The number of seconds of UTC time since Unix epoch
|
||||
* 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
|
||||
* 9999-12-31T23:59:59Z inclusive.
|
||||
* @param {number} nanoseconds The non-negative fractions of a second at
|
||||
* nanosecond resolution. Negative second values with fractions must still
|
||||
* have non-negative nanoseconds values that count forward in time. Must be
|
||||
* from 0 to 999,999,999 inclusive.
|
||||
*/
|
||||
constructor(seconds, nanoseconds) {
|
||||
validate_1.validateInteger('seconds', seconds, {
|
||||
minValue: MIN_SECONDS,
|
||||
maxValue: MAX_SECONDS,
|
||||
});
|
||||
validate_1.validateInteger('nanoseconds', nanoseconds, {
|
||||
minValue: 0,
|
||||
maxValue: 999999999,
|
||||
});
|
||||
this._seconds = seconds;
|
||||
this._nanoseconds = nanoseconds;
|
||||
}
|
||||
/**
|
||||
* Creates a new timestamp with the current date, with millisecond precision.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({ updateTime:Firestore.Timestamp.now() });
|
||||
*
|
||||
* @return {Timestamp} A new `Timestamp` representing the current date.
|
||||
*/
|
||||
static now() {
|
||||
return Timestamp.fromMillis(Date.now());
|
||||
}
|
||||
/**
|
||||
* Creates a new timestamp from the given date.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* let date = Date.parse('01 Jan 2000 00:00:00 GMT');
|
||||
* documentRef.set({ startTime:Firestore.Timestamp.fromDate(date) });
|
||||
*
|
||||
* @param {Date} date The date to initialize the `Timestamp` from.
|
||||
* @return {Timestamp} A new `Timestamp` representing the same point in time
|
||||
* as the given date.
|
||||
*/
|
||||
static fromDate(date) {
|
||||
return Timestamp.fromMillis(date.getTime());
|
||||
}
|
||||
/**
|
||||
* Creates a new timestamp from the given number of milliseconds.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.set({ startTime:Firestore.Timestamp.fromMillis(42) });
|
||||
*
|
||||
* @param {number} milliseconds Number of milliseconds since Unix epoch
|
||||
* 1970-01-01T00:00:00Z.
|
||||
* @return {Timestamp} A new `Timestamp` representing the same point in time
|
||||
* as the given number of milliseconds.
|
||||
*/
|
||||
static fromMillis(milliseconds) {
|
||||
const seconds = Math.floor(milliseconds / 1000);
|
||||
const nanos = Math.floor((milliseconds - seconds * 1000) * MS_TO_NANOS);
|
||||
return new Timestamp(seconds, nanos);
|
||||
}
|
||||
/**
|
||||
* Generates a `Timestamp` object from a Timestamp proto.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param {Object} timestamp The `Timestamp` Protobuf object.
|
||||
*/
|
||||
static fromProto(timestamp) {
|
||||
return new Timestamp(Number(timestamp.seconds || 0), timestamp.nanos || 0);
|
||||
}
|
||||
/**
|
||||
* The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* let updated = snap.updateTime;
|
||||
* console.log(`Updated at ${updated.seconds}s ${updated.nanoseconds}ns`);
|
||||
* });
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
get seconds() {
|
||||
return this._seconds;
|
||||
}
|
||||
/**
|
||||
* The non-negative fractions of a second at nanosecond resolution.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* let updated = snap.updateTime;
|
||||
* console.log(`Updated at ${updated.seconds}s ${updated.nanoseconds}ns`);
|
||||
* });
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
get nanoseconds() {
|
||||
return this._nanoseconds;
|
||||
}
|
||||
/**
|
||||
* Returns a new `Date` corresponding to this timestamp. This may lose
|
||||
* precision.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* console.log(`Document updated at: ${snap.updateTime.toDate()}`);
|
||||
* });
|
||||
*
|
||||
* @return {Date} JavaScript `Date` object representing the same point in time
|
||||
* as this `Timestamp`, with millisecond precision.
|
||||
*/
|
||||
toDate() {
|
||||
return new Date(this._seconds * 1000 + Math.round(this._nanoseconds / MS_TO_NANOS));
|
||||
}
|
||||
/**
|
||||
* Returns the number of milliseconds since Unix epoch 1970-01-01T00:00:00Z.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* let startTime = snap.get('startTime');
|
||||
* let endTime = snap.get('endTime');
|
||||
* console.log(`Duration: ${endTime - startTime}`);
|
||||
* });
|
||||
*
|
||||
* @return {number} The point in time corresponding to this timestamp,
|
||||
* represented as the number of milliseconds since Unix epoch
|
||||
* 1970-01-01T00:00:00Z.
|
||||
*/
|
||||
toMillis() {
|
||||
return this._seconds * 1000 + Math.floor(this._nanoseconds / MS_TO_NANOS);
|
||||
}
|
||||
/**
|
||||
* Returns 'true' if this `Timestamp` is equal to the provided one.
|
||||
*
|
||||
* @example
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
*
|
||||
* documentRef.get().then(snap => {
|
||||
* if (snap.createTime.isEqual(snap.updateTime)) {
|
||||
* console.log('Document is in its initial state.');
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* @param {any} other The `Timestamp` to compare against.
|
||||
* @return {boolean} 'true' if this `Timestamp` is equal to the provided one.
|
||||
*/
|
||||
isEqual(other) {
|
||||
return (this === other ||
|
||||
(other instanceof Timestamp &&
|
||||
this._seconds === other.seconds &&
|
||||
this._nanoseconds === other.nanoseconds));
|
||||
}
|
||||
/**
|
||||
* Generates the Protobuf `Timestamp` object for this timestamp.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns {Object} The `Timestamp` Protobuf object.
|
||||
*/
|
||||
toProto() {
|
||||
const timestamp = {};
|
||||
if (this.seconds) {
|
||||
timestamp.seconds = this.seconds.toString();
|
||||
}
|
||||
if (this.nanoseconds) {
|
||||
timestamp.nanos = this.nanoseconds;
|
||||
}
|
||||
return { timestampValue: timestamp };
|
||||
}
|
||||
/**
|
||||
* Converts this object to a primitive `string`, which allows `Timestamp` objects to be compared
|
||||
* using the `>`, `<=`, `>=` and `>` operators.
|
||||
*
|
||||
* @return {string} a string encoding of this object.
|
||||
*/
|
||||
valueOf() {
|
||||
// This method returns a string of the form <seconds>.<nanoseconds> where <seconds> is
|
||||
// translated to have a non-negative value and both <seconds> and <nanoseconds> are left-padded
|
||||
// with zeroes to be a consistent length. Strings with this format then have a lexicographical
|
||||
// ordering that matches the expected ordering. The <seconds> translation is done to avoid
|
||||
// having a leading negative sign (i.e. a leading '-' character) in its string representation,
|
||||
// which would affect its lexicographical ordering.
|
||||
const adjustedSeconds = this.seconds - MIN_SECONDS;
|
||||
// Note: Up to 12 decimal digits are required to represent all valid 'seconds' values.
|
||||
const formattedSeconds = String(adjustedSeconds).padStart(12, '0');
|
||||
const formattedNanoseconds = String(this.nanoseconds).padStart(9, '0');
|
||||
return formattedSeconds + '.' + formattedNanoseconds;
|
||||
}
|
||||
}
|
||||
exports.Timestamp = Timestamp;
|
||||
//# sourceMappingURL=timestamp.js.map
|
||||
+233
@@ -0,0 +1,233 @@
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import * as firestore from '@google-cloud/firestore';
|
||||
import { DocumentSnapshot } from './document';
|
||||
import { Firestore } from './index';
|
||||
import { Timestamp } from './timestamp';
|
||||
import { FieldPath } from './path';
|
||||
import { DocumentReference, Query, QuerySnapshot } from './reference';
|
||||
/**
|
||||
* A reference to a transaction.
|
||||
*
|
||||
* The Transaction object passed to a transaction's updateFunction provides
|
||||
* the methods to read and write data within the transaction context. See
|
||||
* [runTransaction()]{@link Firestore#runTransaction}.
|
||||
*
|
||||
* @class Transaction
|
||||
*/
|
||||
export declare class Transaction implements firestore.Transaction {
|
||||
private _firestore;
|
||||
private _writeBatch;
|
||||
private _backoff;
|
||||
private _requestTag;
|
||||
private _transactionId?;
|
||||
/**
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param firestore The Firestore Database client.
|
||||
* @param requestTag A unique client-assigned identifier for the scope of
|
||||
* this transaction.
|
||||
*/
|
||||
constructor(firestore: Firestore, requestTag: string);
|
||||
/**
|
||||
* Retrieves a query result. Holds a pessimistic lock on all returned
|
||||
* documents.
|
||||
*
|
||||
* @param {Query} query A query to execute.
|
||||
* @return {Promise<QuerySnapshot>} A QuerySnapshot for the retrieved data.
|
||||
*/
|
||||
get<T>(query: Query<T>): Promise<QuerySnapshot<T>>;
|
||||
/**
|
||||
* Reads the document referenced by the provided `DocumentReference.`
|
||||
* Holds a pessimistic lock on the returned document.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be read.
|
||||
* @return {Promise<DocumentSnapshot>} A DocumentSnapshot for the read data.
|
||||
*/
|
||||
get<T>(documentRef: DocumentReference<T>): Promise<DocumentSnapshot<T>>;
|
||||
/**
|
||||
* Retrieves multiple documents from Firestore. Holds a pessimistic lock on
|
||||
* all returned documents.
|
||||
*
|
||||
* The first argument is required and must be of type `DocumentReference`
|
||||
* followed by any additional `DocumentReference` documents. If used, the
|
||||
* optional `ReadOptions` must be the last argument.
|
||||
*
|
||||
* @param {...DocumentReference|ReadOptions} documentRefsOrReadOptions The
|
||||
* `DocumentReferences` to receive, followed by an optional field mask.
|
||||
* @returns {Promise<Array.<DocumentSnapshot>>} A Promise that
|
||||
* contains an array with the resulting document snapshots.
|
||||
*
|
||||
* @example
|
||||
* let firstDoc = firestore.doc('col/doc1');
|
||||
* let secondDoc = firestore.doc('col/doc2');
|
||||
* let resultDoc = firestore.doc('col/doc3');
|
||||
*
|
||||
* firestore.runTransaction(transaction => {
|
||||
* return transaction.getAll(firstDoc, secondDoc).then(docs => {
|
||||
* transaction.set(resultDoc, {
|
||||
* sum: docs[0].get('count') + docs[1].get('count')
|
||||
* });
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
getAll<T>(...documentRefsOrReadOptions: Array<firestore.DocumentReference<T> | firestore.ReadOptions>): Promise<Array<DocumentSnapshot<T>>>;
|
||||
/**
|
||||
* Create the document referred to by the provided
|
||||
* [DocumentReference]{@link DocumentReference}. The operation will
|
||||
* fail the transaction if a document exists at the specified location.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* created.
|
||||
* @param {DocumentData} data The object data to serialize as the document.
|
||||
* @returns {Transaction} This Transaction instance. Used for
|
||||
* chaining method calls.
|
||||
*
|
||||
* @example
|
||||
* firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* return transaction.get(documentRef).then(doc => {
|
||||
* if (!doc.exists) {
|
||||
* transaction.create(documentRef, { foo: 'bar' });
|
||||
* }
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
create<T>(documentRef: firestore.DocumentReference<T>, data: T): Transaction;
|
||||
set<T>(documentRef: firestore.DocumentReference<T>, data: Partial<T>, options: firestore.SetOptions): Transaction;
|
||||
set<T>(documentRef: firestore.DocumentReference<T>, data: T): Transaction;
|
||||
/**
|
||||
* Updates fields in the document referred to by the provided
|
||||
* [DocumentReference]{@link DocumentReference}. The update will
|
||||
* fail if applied to a document that does not exist.
|
||||
*
|
||||
* The update() method accepts either an object with field paths encoded as
|
||||
* keys and field values encoded as values, or a variable number of arguments
|
||||
* that alternate between field paths and field values. Nested fields can be
|
||||
* updated by providing dot-separated field path strings or by providing
|
||||
* FieldPath objects.
|
||||
*
|
||||
* A Precondition restricting this update can be specified as the last
|
||||
* argument.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* updated.
|
||||
* @param {UpdateData|string|FieldPath} dataOrField An object
|
||||
* containing the fields and values with which to update the document
|
||||
* or the path of the first field to update.
|
||||
* @param {
|
||||
* ...(Precondition|*|string|FieldPath)} preconditionOrValues -
|
||||
* An alternating list of field paths and values to update or a Precondition
|
||||
* to to enforce on this update.
|
||||
* @returns {Transaction} This Transaction instance. Used for
|
||||
* chaining method calls.
|
||||
*
|
||||
* @example
|
||||
* firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* return transaction.get(documentRef).then(doc => {
|
||||
* if (doc.exists) {
|
||||
* transaction.update(documentRef, { count: doc.get('count') + 1 });
|
||||
* } else {
|
||||
* transaction.create(documentRef, { count: 1 });
|
||||
* }
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
update<T>(documentRef: firestore.DocumentReference<T>, dataOrField: firestore.UpdateData | string | firestore.FieldPath, ...preconditionOrValues: Array<firestore.Precondition | unknown | string | firestore.FieldPath>): Transaction;
|
||||
/**
|
||||
* Deletes the document referred to by the provided [DocumentReference]
|
||||
* {@link DocumentReference}.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* deleted.
|
||||
* @param {Precondition=} precondition A precondition to enforce for this
|
||||
* delete.
|
||||
* @param {Timestamp=} precondition.lastUpdateTime If set, enforces that the
|
||||
* document was last updated at lastUpdateTime. Fails the transaction if the
|
||||
* document doesn't exist or was last updated at a different time.
|
||||
* @param {boolean=} precondition.exists If set, enforces that the target
|
||||
* document must or must not exist.
|
||||
* @returns {Transaction} This Transaction instance. Used for
|
||||
* chaining method calls.
|
||||
*
|
||||
* @example
|
||||
* firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* transaction.delete(documentRef);
|
||||
* return Promise.resolve();
|
||||
* });
|
||||
*/
|
||||
delete<T>(documentRef: DocumentReference<T>, precondition?: firestore.Precondition): this;
|
||||
/**
|
||||
* Starts a transaction and obtains the transaction id from the server.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
begin(readOnly: boolean, readTime: Timestamp | undefined): Promise<void>;
|
||||
/**
|
||||
* Commits all queued-up changes in this transaction and releases all locks.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
commit(): Promise<void>;
|
||||
/**
|
||||
* Releases all locks and rolls back this transaction.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
rollback(): Promise<void>;
|
||||
/**
|
||||
* Executes `updateFunction()` and commits the transaction with retry.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param updateFunction The user function to execute within the transaction
|
||||
* context.
|
||||
* @param requestTag A unique client-assigned identifier for the scope of
|
||||
* this transaction.
|
||||
* @param options The user-defined options for this transaction.
|
||||
*/
|
||||
runTransaction<T>(updateFunction: (transaction: Transaction) => Promise<T>, options: {
|
||||
maxAttempts: number;
|
||||
readOnly: boolean;
|
||||
readTime?: Timestamp;
|
||||
}): Promise<T>;
|
||||
/**
|
||||
* Delays further operations based on the provided error.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @return A Promise that resolves after the delay expired.
|
||||
*/
|
||||
private maybeBackoff;
|
||||
}
|
||||
/**
|
||||
* Parses the arguments for the `getAll()` call supported by both the Firestore
|
||||
* and Transaction class.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param documentRefsOrReadOptions An array of document references followed by
|
||||
* an optional ReadOptions object.
|
||||
*/
|
||||
export declare function parseGetAllArguments<T>(documentRefsOrReadOptions: Array<firestore.DocumentReference<T> | firestore.ReadOptions>): {
|
||||
documents: Array<DocumentReference<T>>;
|
||||
fieldMask: FieldPath[] | null;
|
||||
};
|
||||
+457
@@ -0,0 +1,457 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2017 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const backoff_1 = require("./backoff");
|
||||
const logger_1 = require("./logger");
|
||||
const path_1 = require("./path");
|
||||
const reference_1 = require("./reference");
|
||||
const util_1 = require("./util");
|
||||
const validate_1 = require("./validate");
|
||||
const document_reader_1 = require("./document-reader");
|
||||
/*!
|
||||
* Error message for transactional reads that were executed after performing
|
||||
* writes.
|
||||
*/
|
||||
const READ_AFTER_WRITE_ERROR_MSG = 'Firestore transactions require all reads to be executed before all writes.';
|
||||
/**
|
||||
* A reference to a transaction.
|
||||
*
|
||||
* The Transaction object passed to a transaction's updateFunction provides
|
||||
* the methods to read and write data within the transaction context. See
|
||||
* [runTransaction()]{@link Firestore#runTransaction}.
|
||||
*
|
||||
* @class Transaction
|
||||
*/
|
||||
class Transaction {
|
||||
/**
|
||||
* @hideconstructor
|
||||
*
|
||||
* @param firestore The Firestore Database client.
|
||||
* @param requestTag A unique client-assigned identifier for the scope of
|
||||
* this transaction.
|
||||
*/
|
||||
constructor(firestore, requestTag) {
|
||||
this._firestore = firestore;
|
||||
this._writeBatch = firestore.batch();
|
||||
this._requestTag = requestTag;
|
||||
this._backoff = new backoff_1.ExponentialBackoff();
|
||||
}
|
||||
/**
|
||||
* Retrieve a document or a query result from the database. Holds a
|
||||
* pessimistic lock on all returned documents.
|
||||
*
|
||||
* @param {DocumentReference|Query} refOrQuery The document or query to
|
||||
* return.
|
||||
* @returns {Promise} A Promise that resolves with a DocumentSnapshot or
|
||||
* QuerySnapshot for the returned documents.
|
||||
*
|
||||
* @example
|
||||
* firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* return transaction.get(documentRef).then(doc => {
|
||||
* if (doc.exists) {
|
||||
* transaction.update(documentRef, { count: doc.get('count') + 1 });
|
||||
* } else {
|
||||
* transaction.create(documentRef, { count: 1 });
|
||||
* }
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
get(refOrQuery) {
|
||||
if (!this._writeBatch.isEmpty) {
|
||||
throw new Error(READ_AFTER_WRITE_ERROR_MSG);
|
||||
}
|
||||
if (refOrQuery instanceof reference_1.DocumentReference) {
|
||||
const documentReader = new document_reader_1.DocumentReader(this._firestore, [refOrQuery]);
|
||||
documentReader.transactionId = this._transactionId;
|
||||
return documentReader.get(this._requestTag).then(([res]) => res);
|
||||
}
|
||||
if (refOrQuery instanceof reference_1.Query) {
|
||||
return refOrQuery._get(this._transactionId);
|
||||
}
|
||||
throw new Error('Value for argument "refOrQuery" must be a DocumentReference or a Query.');
|
||||
}
|
||||
/**
|
||||
* Retrieves multiple documents from Firestore. Holds a pessimistic lock on
|
||||
* all returned documents.
|
||||
*
|
||||
* The first argument is required and must be of type `DocumentReference`
|
||||
* followed by any additional `DocumentReference` documents. If used, the
|
||||
* optional `ReadOptions` must be the last argument.
|
||||
*
|
||||
* @param {...DocumentReference|ReadOptions} documentRefsOrReadOptions The
|
||||
* `DocumentReferences` to receive, followed by an optional field mask.
|
||||
* @returns {Promise<Array.<DocumentSnapshot>>} A Promise that
|
||||
* contains an array with the resulting document snapshots.
|
||||
*
|
||||
* @example
|
||||
* let firstDoc = firestore.doc('col/doc1');
|
||||
* let secondDoc = firestore.doc('col/doc2');
|
||||
* let resultDoc = firestore.doc('col/doc3');
|
||||
*
|
||||
* firestore.runTransaction(transaction => {
|
||||
* return transaction.getAll(firstDoc, secondDoc).then(docs => {
|
||||
* transaction.set(resultDoc, {
|
||||
* sum: docs[0].get('count') + docs[1].get('count')
|
||||
* });
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
getAll(...documentRefsOrReadOptions) {
|
||||
if (!this._writeBatch.isEmpty) {
|
||||
throw new Error(READ_AFTER_WRITE_ERROR_MSG);
|
||||
}
|
||||
validate_1.validateMinNumberOfArguments('Transaction.getAll', documentRefsOrReadOptions, 1);
|
||||
const { documents, fieldMask } = parseGetAllArguments(documentRefsOrReadOptions);
|
||||
const documentReader = new document_reader_1.DocumentReader(this._firestore, documents);
|
||||
documentReader.fieldMask = fieldMask || undefined;
|
||||
documentReader.transactionId = this._transactionId;
|
||||
return documentReader.get(this._requestTag);
|
||||
}
|
||||
/**
|
||||
* Create the document referred to by the provided
|
||||
* [DocumentReference]{@link DocumentReference}. The operation will
|
||||
* fail the transaction if a document exists at the specified location.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* created.
|
||||
* @param {DocumentData} data The object data to serialize as the document.
|
||||
* @returns {Transaction} This Transaction instance. Used for
|
||||
* chaining method calls.
|
||||
*
|
||||
* @example
|
||||
* firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* return transaction.get(documentRef).then(doc => {
|
||||
* if (!doc.exists) {
|
||||
* transaction.create(documentRef, { foo: 'bar' });
|
||||
* }
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
create(documentRef, data) {
|
||||
this._writeBatch.create(documentRef, data);
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Writes to the document referred to by the provided
|
||||
* [DocumentReference]{@link DocumentReference}. If the document
|
||||
* does not exist yet, it will be created. If you pass
|
||||
* [SetOptions]{@link SetOptions}, the provided data can be merged into the
|
||||
* existing document.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* set.
|
||||
* @param {T|Partial<T>} data The object to serialize as the document.
|
||||
* @param {SetOptions=} options An object to configure the set behavior.
|
||||
* @param {boolean=} options.merge - If true, set() merges the values
|
||||
* specified in its data argument. Fields omitted from this set() call
|
||||
* remain untouched.
|
||||
* @param {Array.<string|FieldPath>=} options.mergeFields - If provided,
|
||||
* set() only replaces the specified field paths. Any field path that is not
|
||||
* specified is ignored and remains untouched.
|
||||
* @returns {Transaction} This Transaction instance. Used for
|
||||
* chaining method calls.
|
||||
*
|
||||
* @example
|
||||
* firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* transaction.set(documentRef, { foo: 'bar' });
|
||||
* return Promise.resolve();
|
||||
* });
|
||||
*/
|
||||
set(documentRef, data, options) {
|
||||
this._writeBatch.set(documentRef, data, options);
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Updates fields in the document referred to by the provided
|
||||
* [DocumentReference]{@link DocumentReference}. The update will
|
||||
* fail if applied to a document that does not exist.
|
||||
*
|
||||
* The update() method accepts either an object with field paths encoded as
|
||||
* keys and field values encoded as values, or a variable number of arguments
|
||||
* that alternate between field paths and field values. Nested fields can be
|
||||
* updated by providing dot-separated field path strings or by providing
|
||||
* FieldPath objects.
|
||||
*
|
||||
* A Precondition restricting this update can be specified as the last
|
||||
* argument.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* updated.
|
||||
* @param {UpdateData|string|FieldPath} dataOrField An object
|
||||
* containing the fields and values with which to update the document
|
||||
* or the path of the first field to update.
|
||||
* @param {
|
||||
* ...(Precondition|*|string|FieldPath)} preconditionOrValues -
|
||||
* An alternating list of field paths and values to update or a Precondition
|
||||
* to to enforce on this update.
|
||||
* @returns {Transaction} This Transaction instance. Used for
|
||||
* chaining method calls.
|
||||
*
|
||||
* @example
|
||||
* firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* return transaction.get(documentRef).then(doc => {
|
||||
* if (doc.exists) {
|
||||
* transaction.update(documentRef, { count: doc.get('count') + 1 });
|
||||
* } else {
|
||||
* transaction.create(documentRef, { count: 1 });
|
||||
* }
|
||||
* });
|
||||
* });
|
||||
*/
|
||||
update(documentRef, dataOrField, ...preconditionOrValues) {
|
||||
// eslint-disable-next-line prefer-rest-params
|
||||
validate_1.validateMinNumberOfArguments('Transaction.update', arguments, 2);
|
||||
this._writeBatch.update(documentRef, dataOrField, ...preconditionOrValues);
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Deletes the document referred to by the provided [DocumentReference]
|
||||
* {@link DocumentReference}.
|
||||
*
|
||||
* @param {DocumentReference} documentRef A reference to the document to be
|
||||
* deleted.
|
||||
* @param {Precondition=} precondition A precondition to enforce for this
|
||||
* delete.
|
||||
* @param {Timestamp=} precondition.lastUpdateTime If set, enforces that the
|
||||
* document was last updated at lastUpdateTime. Fails the transaction if the
|
||||
* document doesn't exist or was last updated at a different time.
|
||||
* @param {boolean=} precondition.exists If set, enforces that the target
|
||||
* document must or must not exist.
|
||||
* @returns {Transaction} This Transaction instance. Used for
|
||||
* chaining method calls.
|
||||
*
|
||||
* @example
|
||||
* firestore.runTransaction(transaction => {
|
||||
* let documentRef = firestore.doc('col/doc');
|
||||
* transaction.delete(documentRef);
|
||||
* return Promise.resolve();
|
||||
* });
|
||||
*/
|
||||
delete(documentRef, precondition) {
|
||||
this._writeBatch.delete(documentRef, precondition);
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Starts a transaction and obtains the transaction id from the server.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
begin(readOnly, readTime) {
|
||||
var _a;
|
||||
const request = {
|
||||
database: this._firestore.formattedName,
|
||||
};
|
||||
if (readOnly) {
|
||||
request.options = {
|
||||
readOnly: {
|
||||
readTime: (_a = readTime === null || readTime === void 0 ? void 0 : readTime.toProto()) === null || _a === void 0 ? void 0 : _a.timestampValue,
|
||||
},
|
||||
};
|
||||
}
|
||||
else if (this._transactionId) {
|
||||
request.options = {
|
||||
readWrite: {
|
||||
retryTransaction: this._transactionId,
|
||||
},
|
||||
};
|
||||
}
|
||||
return this._firestore
|
||||
.request('beginTransaction', request, this._requestTag)
|
||||
.then(resp => {
|
||||
this._transactionId = resp.transaction;
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Commits all queued-up changes in this transaction and releases all locks.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
commit() {
|
||||
return this._writeBatch
|
||||
._commit({
|
||||
transactionId: this._transactionId,
|
||||
requestTag: this._requestTag,
|
||||
})
|
||||
.then(() => { });
|
||||
}
|
||||
/**
|
||||
* Releases all locks and rolls back this transaction.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
rollback() {
|
||||
const request = {
|
||||
database: this._firestore.formattedName,
|
||||
transaction: this._transactionId,
|
||||
};
|
||||
return this._firestore.request('rollback', request, this._requestTag);
|
||||
}
|
||||
/**
|
||||
* Executes `updateFunction()` and commits the transaction with retry.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param updateFunction The user function to execute within the transaction
|
||||
* context.
|
||||
* @param requestTag A unique client-assigned identifier for the scope of
|
||||
* this transaction.
|
||||
* @param options The user-defined options for this transaction.
|
||||
*/
|
||||
async runTransaction(updateFunction, options) {
|
||||
let result;
|
||||
let lastError = undefined;
|
||||
for (let attempt = 0; attempt < options.maxAttempts; ++attempt) {
|
||||
try {
|
||||
if (lastError) {
|
||||
logger_1.logger('Firestore.runTransaction', this._requestTag, 'Retrying transaction after error:', lastError);
|
||||
await this.rollback();
|
||||
}
|
||||
this._writeBatch._reset();
|
||||
await this.maybeBackoff(lastError);
|
||||
await this.begin(options.readOnly, options.readTime);
|
||||
const promise = updateFunction(this);
|
||||
if (!(promise instanceof Promise)) {
|
||||
throw new Error('You must return a Promise in your transaction()-callback.');
|
||||
}
|
||||
result = await promise;
|
||||
await this.commit();
|
||||
return result;
|
||||
}
|
||||
catch (err) {
|
||||
logger_1.logger('Firestore.runTransaction', this._requestTag, 'Rolling back transaction after callback error:', err);
|
||||
lastError = err;
|
||||
if (!this._transactionId || !isRetryableTransactionError(err)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
logger_1.logger('Firestore.runTransaction', this._requestTag, 'Transaction not eligible for retry, returning error: %s', lastError);
|
||||
await this.rollback();
|
||||
return Promise.reject(lastError);
|
||||
}
|
||||
/**
|
||||
* Delays further operations based on the provided error.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @return A Promise that resolves after the delay expired.
|
||||
*/
|
||||
async maybeBackoff(error) {
|
||||
if ((error === null || error === void 0 ? void 0 : error.code) === 8 /* RESOURCE_EXHAUSTED */) {
|
||||
this._backoff.resetToMax();
|
||||
}
|
||||
await this._backoff.backoffAndWait();
|
||||
}
|
||||
}
|
||||
exports.Transaction = Transaction;
|
||||
/**
|
||||
* Parses the arguments for the `getAll()` call supported by both the Firestore
|
||||
* and Transaction class.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param documentRefsOrReadOptions An array of document references followed by
|
||||
* an optional ReadOptions object.
|
||||
*/
|
||||
function parseGetAllArguments(documentRefsOrReadOptions) {
|
||||
let documents;
|
||||
let readOptions = undefined;
|
||||
if (Array.isArray(documentRefsOrReadOptions[0])) {
|
||||
throw new Error('getAll() no longer accepts an array as its first argument. ' +
|
||||
'Please unpack your array and call getAll() with individual arguments.');
|
||||
}
|
||||
if (documentRefsOrReadOptions.length > 0 &&
|
||||
util_1.isPlainObject(documentRefsOrReadOptions[documentRefsOrReadOptions.length - 1])) {
|
||||
readOptions = documentRefsOrReadOptions.pop();
|
||||
documents = documentRefsOrReadOptions;
|
||||
}
|
||||
else {
|
||||
documents = documentRefsOrReadOptions;
|
||||
}
|
||||
for (let i = 0; i < documents.length; ++i) {
|
||||
reference_1.validateDocumentReference(i, documents[i]);
|
||||
}
|
||||
validateReadOptions('options', readOptions, { optional: true });
|
||||
const fieldMask = readOptions && readOptions.fieldMask
|
||||
? readOptions.fieldMask.map(fieldPath => path_1.FieldPath.fromArgument(fieldPath))
|
||||
: null;
|
||||
return { fieldMask, documents };
|
||||
}
|
||||
exports.parseGetAllArguments = parseGetAllArguments;
|
||||
/**
|
||||
* Validates the use of 'options' as ReadOptions and enforces that 'fieldMask'
|
||||
* is an array of strings or field paths.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param arg The argument name or argument index (for varargs methods).
|
||||
* @param value The input to validate.
|
||||
* @param options Options that specify whether the ReadOptions can be omitted.
|
||||
*/
|
||||
function validateReadOptions(arg, value, options) {
|
||||
if (!validate_1.validateOptional(value, options)) {
|
||||
if (!util_1.isObject(value)) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'read option')} Input is not an object.'`);
|
||||
}
|
||||
const options = value;
|
||||
if (options.fieldMask !== undefined) {
|
||||
if (!Array.isArray(options.fieldMask)) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'read option')} "fieldMask" is not an array.`);
|
||||
}
|
||||
for (let i = 0; i < options.fieldMask.length; ++i) {
|
||||
try {
|
||||
path_1.validateFieldPath(i, options.fieldMask[i]);
|
||||
}
|
||||
catch (err) {
|
||||
throw new Error(`${validate_1.invalidArgumentMessage(arg, 'read option')} "fieldMask" is not valid: ${err.message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function isRetryableTransactionError(error) {
|
||||
if (error.code !== undefined) {
|
||||
// This list is based on https://github.com/firebase/firebase-js-sdk/blob/master/packages/firestore/src/core/transaction_runner.ts#L112
|
||||
switch (error.code) {
|
||||
case 10 /* ABORTED */:
|
||||
case 1 /* CANCELLED */:
|
||||
case 2 /* UNKNOWN */:
|
||||
case 4 /* DEADLINE_EXCEEDED */:
|
||||
case 13 /* INTERNAL */:
|
||||
case 14 /* UNAVAILABLE */:
|
||||
case 16 /* UNAUTHENTICATED */:
|
||||
case 8 /* RESOURCE_EXHAUSTED */:
|
||||
return true;
|
||||
case 3 /* INVALID_ARGUMENT */:
|
||||
// The Firestore backend uses "INVALID_ARGUMENT" for transactions
|
||||
// IDs that have expired. While INVALID_ARGUMENT is generally not
|
||||
// retryable, we retry this specific case.
|
||||
return !!error.message.match(/transaction has expired/);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
//# sourceMappingURL=transaction.js.map
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
/// <reference types="node" />
|
||||
import { FirestoreDataConverter } from '@google-cloud/firestore';
|
||||
import { CallOptions } from 'google-gax';
|
||||
import { Duplex } from 'stream';
|
||||
import { google } from '../protos/firestore_v1_proto_api';
|
||||
import { FieldPath } from './path';
|
||||
import api = google.firestore.v1;
|
||||
/**
|
||||
* A map in the format of the Proto API
|
||||
*/
|
||||
export interface ApiMapValue {
|
||||
[k: string]: google.firestore.v1.IValue;
|
||||
}
|
||||
/**
|
||||
* The subset of methods we use from FirestoreClient.
|
||||
*
|
||||
* We don't depend on the actual Gapic client to avoid loading the GAX stack at
|
||||
* module initialization time.
|
||||
*/
|
||||
export interface GapicClient {
|
||||
getProjectId(): Promise<string>;
|
||||
beginTransaction(request: api.IBeginTransactionRequest, options?: CallOptions): Promise<[api.IBeginTransactionResponse, unknown, unknown]>;
|
||||
commit(request: api.ICommitRequest, options?: CallOptions): Promise<[api.ICommitResponse, unknown, unknown]>;
|
||||
batchWrite(request: api.IBatchWriteRequest, options?: CallOptions): Promise<[api.IBatchWriteResponse, unknown, unknown]>;
|
||||
rollback(request: api.IRollbackRequest, options?: CallOptions): Promise<[google.protobuf.IEmpty, unknown, unknown]>;
|
||||
batchGetDocuments(request?: api.IBatchGetDocumentsRequest, options?: CallOptions): Duplex;
|
||||
runQuery(request?: api.IRunQueryRequest, options?: CallOptions): Duplex;
|
||||
listDocuments(request: api.IListDocumentsRequest, options?: CallOptions): Promise<[api.IDocument[], unknown, unknown]>;
|
||||
listCollectionIds(request: api.IListCollectionIdsRequest, options?: CallOptions): Promise<[string[], unknown, unknown]>;
|
||||
listen(options?: CallOptions): Duplex;
|
||||
partitionQueryStream(request?: api.IPartitionQueryRequest, options?: CallOptions): Duplex;
|
||||
close(): Promise<void>;
|
||||
}
|
||||
/** Request/response methods used in the Firestore SDK. */
|
||||
export declare type FirestoreUnaryMethod = 'listDocuments' | 'listCollectionIds' | 'rollback' | 'beginTransaction' | 'commit' | 'batchWrite';
|
||||
/** Streaming methods used in the Firestore SDK. */
|
||||
export declare type FirestoreStreamingMethod = 'listen' | 'partitionQueryStream' | 'runQuery' | 'batchGetDocuments';
|
||||
/** Type signature for the unary methods in the GAPIC layer. */
|
||||
export declare type UnaryMethod<Req, Resp> = (request: Req, callOptions: CallOptions) => Promise<[Resp, unknown, unknown]>;
|
||||
export declare type RBTree = any;
|
||||
/**
|
||||
* A default converter to use when none is provided.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function defaultConverter<T>(): FirestoreDataConverter<T>;
|
||||
/**
|
||||
* Update data that has been resolved to a mapping of FieldPaths to values.
|
||||
*/
|
||||
export declare type UpdateMap = Map<FieldPath, unknown>;
|
||||
/**
|
||||
* Internal user data validation options.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export interface ValidationOptions {
|
||||
/** At what level field deletes are supported. */
|
||||
allowDeletes: 'none' | 'root' | 'all';
|
||||
/** Whether server transforms are supported. */
|
||||
allowTransforms: boolean;
|
||||
/**
|
||||
* Whether undefined values are allowed. Undefined values cannot appear at
|
||||
* the root.
|
||||
*/
|
||||
allowUndefined: boolean;
|
||||
}
|
||||
/**
|
||||
* A Firestore Proto value in ProtoJs format.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export interface ProtobufJsValue extends api.IValue {
|
||||
valueType?: string;
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/**
|
||||
* A default converter to use when none is provided.
|
||||
*
|
||||
* By declaring the converter as a variable instead of creating the object
|
||||
* inside defaultConverter(), object equality when comparing default converters
|
||||
* is preserved.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
const defaultConverterObj = {
|
||||
toFirestore(modelObject) {
|
||||
return modelObject;
|
||||
},
|
||||
fromFirestore(snapshot) {
|
||||
return snapshot.data();
|
||||
},
|
||||
};
|
||||
/**
|
||||
* A default converter to use when none is provided.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function defaultConverter() {
|
||||
return defaultConverterObj;
|
||||
}
|
||||
exports.defaultConverter = defaultConverter;
|
||||
//# sourceMappingURL=types.js.map
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
import { DocumentData } from '@google-cloud/firestore';
|
||||
import { GoogleError } from 'google-gax';
|
||||
import { BackoffSettings } from 'google-gax/build/src/gax';
|
||||
/**
|
||||
* A Promise implementation that supports deferred resolution.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare class Deferred<R> {
|
||||
promise: Promise<R>;
|
||||
resolve: (value?: R | Promise<R>) => void;
|
||||
reject: (reason?: Error) => void;
|
||||
constructor();
|
||||
}
|
||||
/**
|
||||
* Generate a unique client-side identifier.
|
||||
*
|
||||
* Used for the creation of new documents.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns {string} A unique 20-character wide identifier.
|
||||
*/
|
||||
export declare function autoId(): string;
|
||||
/**
|
||||
* Generate a short and semi-random client-side identifier.
|
||||
*
|
||||
* Used for the creation of request tags.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns {string} A random 5-character wide identifier.
|
||||
*/
|
||||
export declare function requestTag(): string;
|
||||
/**
|
||||
* Determines whether `value` is a JavaScript object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function isObject(value: unknown): value is {
|
||||
[k: string]: unknown;
|
||||
};
|
||||
/**
|
||||
* Verifies that 'obj' is a plain JavaScript object that can be encoded as a
|
||||
* 'Map' in Firestore.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param input The argument to verify.
|
||||
* @returns 'true' if the input can be a treated as a plain object.
|
||||
*/
|
||||
export declare function isPlainObject(input: unknown): input is DocumentData;
|
||||
/**
|
||||
* Returns whether `value` has no custom properties.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function isEmpty(value: {}): boolean;
|
||||
/**
|
||||
* Determines whether `value` is a JavaScript function.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function isFunction(value: unknown): boolean;
|
||||
/**
|
||||
* Determines whether the provided error is considered permanent for the given
|
||||
* RPC.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function isPermanentRpcError(err: GoogleError, methodName: string): boolean;
|
||||
/**
|
||||
* Returns the list of retryable error codes specified in the service
|
||||
* configuration.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function getRetryCodes(methodName: string): number[];
|
||||
/**
|
||||
* Returns the backoff setting from the service configuration.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function getRetryParams(methodName: string): BackoffSettings;
|
||||
/**
|
||||
* Returns a promise with a void return type. The returned promise swallows all
|
||||
* errors and never throws.
|
||||
*
|
||||
* This is primarily used to wait for a promise to complete when the result of
|
||||
* the promise will be discarded.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function silencePromise(promise: Promise<unknown>): Promise<void>;
|
||||
/**
|
||||
* Wraps the provided error in a new error that includes the provided stack.
|
||||
*
|
||||
* Used to preserve stack traces across async calls.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
export declare function wrapError(err: Error, stack: string): Error;
|
||||
+194
@@ -0,0 +1,194 @@
|
||||
"use strict";
|
||||
/*!
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const crypto_1 = require("crypto");
|
||||
const gapicConfig = require("./v1/firestore_client_config.json");
|
||||
/**
|
||||
* A Promise implementation that supports deferred resolution.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
class Deferred {
|
||||
constructor() {
|
||||
this.resolve = () => { };
|
||||
this.reject = () => { };
|
||||
this.promise = new Promise((resolve, reject) => {
|
||||
this.resolve = resolve;
|
||||
this.reject = reject;
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.Deferred = Deferred;
|
||||
/**
|
||||
* Generate a unique client-side identifier.
|
||||
*
|
||||
* Used for the creation of new documents.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns {string} A unique 20-character wide identifier.
|
||||
*/
|
||||
function autoId() {
|
||||
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||
let autoId = '';
|
||||
while (autoId.length < 20) {
|
||||
const bytes = crypto_1.randomBytes(40);
|
||||
bytes.forEach(b => {
|
||||
// Length of `chars` is 62. We only take bytes between 0 and 62*4-1
|
||||
// (both inclusive). The value is then evenly mapped to indices of `char`
|
||||
// via a modulo operation.
|
||||
const maxValue = 62 * 4 - 1;
|
||||
if (autoId.length < 20 && b <= maxValue) {
|
||||
autoId += chars.charAt(b % 62);
|
||||
}
|
||||
});
|
||||
}
|
||||
return autoId;
|
||||
}
|
||||
exports.autoId = autoId;
|
||||
/**
|
||||
* Generate a short and semi-random client-side identifier.
|
||||
*
|
||||
* Used for the creation of request tags.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @returns {string} A random 5-character wide identifier.
|
||||
*/
|
||||
function requestTag() {
|
||||
return autoId().substr(0, 5);
|
||||
}
|
||||
exports.requestTag = requestTag;
|
||||
/**
|
||||
* Determines whether `value` is a JavaScript object.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function isObject(value) {
|
||||
return Object.prototype.toString.call(value) === '[object Object]';
|
||||
}
|
||||
exports.isObject = isObject;
|
||||
/**
|
||||
* Verifies that 'obj' is a plain JavaScript object that can be encoded as a
|
||||
* 'Map' in Firestore.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
* @param input The argument to verify.
|
||||
* @returns 'true' if the input can be a treated as a plain object.
|
||||
*/
|
||||
function isPlainObject(input) {
|
||||
return (isObject(input) &&
|
||||
(Object.getPrototypeOf(input) === Object.prototype ||
|
||||
Object.getPrototypeOf(input) === null ||
|
||||
input.constructor.name === 'Object'));
|
||||
}
|
||||
exports.isPlainObject = isPlainObject;
|
||||
/**
|
||||
* Returns whether `value` has no custom properties.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function isEmpty(value) {
|
||||
return Object.keys(value).length === 0;
|
||||
}
|
||||
exports.isEmpty = isEmpty;
|
||||
/**
|
||||
* Determines whether `value` is a JavaScript function.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function isFunction(value) {
|
||||
return typeof value === 'function';
|
||||
}
|
||||
exports.isFunction = isFunction;
|
||||
/**
|
||||
* Determines whether the provided error is considered permanent for the given
|
||||
* RPC.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function isPermanentRpcError(err, methodName) {
|
||||
if (err.code !== undefined) {
|
||||
const retryCodes = getRetryCodes(methodName);
|
||||
return retryCodes.indexOf(err.code) === -1;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
exports.isPermanentRpcError = isPermanentRpcError;
|
||||
let serviceConfig;
|
||||
/** Lazy-loads the service config when first accessed. */
|
||||
function getServiceConfig(methodName) {
|
||||
if (!serviceConfig) {
|
||||
serviceConfig = require('google-gax').constructSettings('google.firestore.v1.Firestore', gapicConfig, {}, require('google-gax').Status);
|
||||
}
|
||||
return serviceConfig[methodName];
|
||||
}
|
||||
/**
|
||||
* Returns the list of retryable error codes specified in the service
|
||||
* configuration.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function getRetryCodes(methodName) {
|
||||
var _a, _b, _c;
|
||||
return (_c = (_b = (_a = getServiceConfig(methodName)) === null || _a === void 0 ? void 0 : _a.retry) === null || _b === void 0 ? void 0 : _b.retryCodes) !== null && _c !== void 0 ? _c : [];
|
||||
}
|
||||
exports.getRetryCodes = getRetryCodes;
|
||||
/**
|
||||
* Returns the backoff setting from the service configuration.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function getRetryParams(methodName) {
|
||||
var _a, _b, _c;
|
||||
return ((_c = (_b = (_a = getServiceConfig(methodName)) === null || _a === void 0 ? void 0 : _a.retry) === null || _b === void 0 ? void 0 : _b.backoffSettings) !== null && _c !== void 0 ? _c : require('google-gax').createDefaultBackoffSettings());
|
||||
}
|
||||
exports.getRetryParams = getRetryParams;
|
||||
/**
|
||||
* Returns a promise with a void return type. The returned promise swallows all
|
||||
* errors and never throws.
|
||||
*
|
||||
* This is primarily used to wait for a promise to complete when the result of
|
||||
* the promise will be discarded.
|
||||
*
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function silencePromise(promise) {
|
||||
return promise.then(() => { }, () => { });
|
||||
}
|
||||
exports.silencePromise = silencePromise;
|
||||
/**
|
||||
* Wraps the provided error in a new error that includes the provided stack.
|
||||
*
|
||||
* Used to preserve stack traces across async calls.
|
||||
* @private
|
||||
* @internal
|
||||
*/
|
||||
function wrapError(err, stack) {
|
||||
err.stack += '\nCaused by: ' + stack;
|
||||
return err;
|
||||
}
|
||||
exports.wrapError = wrapError;
|
||||
//# sourceMappingURL=util.js.map
|
||||
+477
@@ -0,0 +1,477 @@
|
||||
/// <reference types="node" />
|
||||
import * as gax from 'google-gax';
|
||||
import { Callback, CallOptions, Descriptors, ClientOptions, LROperation, PaginationCallback } from 'google-gax';
|
||||
import { Transform } from 'stream';
|
||||
import * as protos from '../../protos/firestore_admin_v1_proto_api';
|
||||
/**
|
||||
* Operations are created by service `FirestoreAdmin`, but are accessed via
|
||||
* service `google.longrunning.Operations`.
|
||||
* @class
|
||||
* @memberof v1
|
||||
*/
|
||||
export declare class FirestoreAdminClient {
|
||||
private _terminated;
|
||||
private _opts;
|
||||
private _providedCustomServicePath;
|
||||
private _gaxModule;
|
||||
private _gaxGrpc;
|
||||
private _protos;
|
||||
private _defaults;
|
||||
auth: gax.GoogleAuth;
|
||||
descriptors: Descriptors;
|
||||
warn: (code: string, message: string, warnType?: string) => void;
|
||||
innerApiCalls: {
|
||||
[name: string]: Function;
|
||||
};
|
||||
pathTemplates: {
|
||||
[name: string]: gax.PathTemplate;
|
||||
};
|
||||
operationsClient: gax.OperationsClient;
|
||||
firestoreAdminStub?: Promise<{
|
||||
[name: string]: Function;
|
||||
}>;
|
||||
/**
|
||||
* Construct an instance of FirestoreAdminClient.
|
||||
*
|
||||
* @param {object} [options] - The configuration object.
|
||||
* The options accepted by the constructor are described in detail
|
||||
* in [this document](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#creating-the-client-instance).
|
||||
* The common options are:
|
||||
* @param {object} [options.credentials] - Credentials object.
|
||||
* @param {string} [options.credentials.client_email]
|
||||
* @param {string} [options.credentials.private_key]
|
||||
* @param {string} [options.email] - Account email address. Required when
|
||||
* using a .pem or .p12 keyFilename.
|
||||
* @param {string} [options.keyFilename] - Full path to the a .json, .pem, or
|
||||
* .p12 key downloaded from the Google Developers Console. If you provide
|
||||
* a path to a JSON file, the projectId option below is not necessary.
|
||||
* NOTE: .pem and .p12 require you to specify options.email as well.
|
||||
* @param {number} [options.port] - The port on which to connect to
|
||||
* the remote host.
|
||||
* @param {string} [options.projectId] - The project ID from the Google
|
||||
* Developer's Console, e.g. 'grape-spaceship-123'. We will also check
|
||||
* the environment variable GCLOUD_PROJECT for your project ID. If your
|
||||
* app is running in an environment which supports
|
||||
* {@link https://developers.google.com/identity/protocols/application-default-credentials Application Default Credentials},
|
||||
* your project ID will be detected automatically.
|
||||
* @param {string} [options.apiEndpoint] - The domain name of the
|
||||
* API remote host.
|
||||
* @param {gax.ClientConfig} [options.clientConfig] - Client configuration override.
|
||||
* Follows the structure of {@link gapicConfig}.
|
||||
* @param {boolean} [options.fallback] - Use HTTP fallback mode.
|
||||
* In fallback mode, a special browser-compatible transport implementation is used
|
||||
* instead of gRPC transport. In browser context (if the `window` object is defined)
|
||||
* the fallback mode is enabled automatically; set `options.fallback` to `false`
|
||||
* if you need to override this behavior.
|
||||
*/
|
||||
constructor(opts?: ClientOptions);
|
||||
/**
|
||||
* Initialize the client.
|
||||
* Performs asynchronous operations (such as authentication) and prepares the client.
|
||||
* This function will be called automatically when any class method is called for the
|
||||
* first time, but if you need to initialize it before calling an actual method,
|
||||
* feel free to call initialize() directly.
|
||||
*
|
||||
* You can await on this method if you want to make sure the client is initialized.
|
||||
*
|
||||
* @returns {Promise} A promise that resolves to an authenticated service stub.
|
||||
*/
|
||||
initialize(): Promise<{
|
||||
[name: string]: Function;
|
||||
}>;
|
||||
/**
|
||||
* The DNS address for this API service.
|
||||
* @returns {string} The DNS address for this service.
|
||||
*/
|
||||
static get servicePath(): string;
|
||||
/**
|
||||
* The DNS address for this API service - same as servicePath(),
|
||||
* exists for compatibility reasons.
|
||||
* @returns {string} The DNS address for this service.
|
||||
*/
|
||||
static get apiEndpoint(): string;
|
||||
/**
|
||||
* The port for this API service.
|
||||
* @returns {number} The default port for this service.
|
||||
*/
|
||||
static get port(): number;
|
||||
/**
|
||||
* The scopes needed to make gRPC calls for every method defined
|
||||
* in this service.
|
||||
* @returns {string[]} List of default scopes.
|
||||
*/
|
||||
static get scopes(): string[];
|
||||
getProjectId(): Promise<string>;
|
||||
getProjectId(callback: Callback<string, undefined, undefined>): void;
|
||||
getIndex(request?: protos.google.firestore.admin.v1.IGetIndexRequest, options?: CallOptions): Promise<[protos.google.firestore.admin.v1.IIndex, protos.google.firestore.admin.v1.IGetIndexRequest | undefined, {} | undefined]>;
|
||||
getIndex(request: protos.google.firestore.admin.v1.IGetIndexRequest, options: CallOptions, callback: Callback<protos.google.firestore.admin.v1.IIndex, protos.google.firestore.admin.v1.IGetIndexRequest | null | undefined, {} | null | undefined>): void;
|
||||
getIndex(request: protos.google.firestore.admin.v1.IGetIndexRequest, callback: Callback<protos.google.firestore.admin.v1.IIndex, protos.google.firestore.admin.v1.IGetIndexRequest | null | undefined, {} | null | undefined>): void;
|
||||
deleteIndex(request?: protos.google.firestore.admin.v1.IDeleteIndexRequest, options?: CallOptions): Promise<[protos.google.protobuf.IEmpty, protos.google.firestore.admin.v1.IDeleteIndexRequest | undefined, {} | undefined]>;
|
||||
deleteIndex(request: protos.google.firestore.admin.v1.IDeleteIndexRequest, options: CallOptions, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.admin.v1.IDeleteIndexRequest | null | undefined, {} | null | undefined>): void;
|
||||
deleteIndex(request: protos.google.firestore.admin.v1.IDeleteIndexRequest, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.admin.v1.IDeleteIndexRequest | null | undefined, {} | null | undefined>): void;
|
||||
getField(request?: protos.google.firestore.admin.v1.IGetFieldRequest, options?: CallOptions): Promise<[protos.google.firestore.admin.v1.IField, protos.google.firestore.admin.v1.IGetFieldRequest | undefined, {} | undefined]>;
|
||||
getField(request: protos.google.firestore.admin.v1.IGetFieldRequest, options: CallOptions, callback: Callback<protos.google.firestore.admin.v1.IField, protos.google.firestore.admin.v1.IGetFieldRequest | null | undefined, {} | null | undefined>): void;
|
||||
getField(request: protos.google.firestore.admin.v1.IGetFieldRequest, callback: Callback<protos.google.firestore.admin.v1.IField, protos.google.firestore.admin.v1.IGetFieldRequest | null | undefined, {} | null | undefined>): void;
|
||||
createIndex(request?: protos.google.firestore.admin.v1.ICreateIndexRequest, options?: CallOptions): Promise<[LROperation<protos.google.firestore.admin.v1.IIndex, protos.google.firestore.admin.v1.IIndexOperationMetadata>, protos.google.longrunning.IOperation | undefined, {} | undefined]>;
|
||||
createIndex(request: protos.google.firestore.admin.v1.ICreateIndexRequest, options: CallOptions, callback: Callback<LROperation<protos.google.firestore.admin.v1.IIndex, protos.google.firestore.admin.v1.IIndexOperationMetadata>, protos.google.longrunning.IOperation | null | undefined, {} | null | undefined>): void;
|
||||
createIndex(request: protos.google.firestore.admin.v1.ICreateIndexRequest, callback: Callback<LROperation<protos.google.firestore.admin.v1.IIndex, protos.google.firestore.admin.v1.IIndexOperationMetadata>, protos.google.longrunning.IOperation | null | undefined, {} | null | undefined>): void;
|
||||
/**
|
||||
* Check the status of the long running operation returned by `createIndex()`.
|
||||
* @param {String} name
|
||||
* The operation name that will be passed.
|
||||
* @returns {Promise} - The promise which resolves to an object.
|
||||
* The decoded operation object has result and metadata field to get information from.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#long-running-operations)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const decodedOperation = await checkCreateIndexProgress(name);
|
||||
* console.log(decodedOperation.result);
|
||||
* console.log(decodedOperation.done);
|
||||
* console.log(decodedOperation.metadata);
|
||||
*/
|
||||
checkCreateIndexProgress(name: string): Promise<LROperation<protos.google.firestore.admin.v1.Index, protos.google.firestore.admin.v1.IndexOperationMetadata>>;
|
||||
updateField(request?: protos.google.firestore.admin.v1.IUpdateFieldRequest, options?: CallOptions): Promise<[LROperation<protos.google.firestore.admin.v1.IField, protos.google.firestore.admin.v1.IFieldOperationMetadata>, protos.google.longrunning.IOperation | undefined, {} | undefined]>;
|
||||
updateField(request: protos.google.firestore.admin.v1.IUpdateFieldRequest, options: CallOptions, callback: Callback<LROperation<protos.google.firestore.admin.v1.IField, protos.google.firestore.admin.v1.IFieldOperationMetadata>, protos.google.longrunning.IOperation | null | undefined, {} | null | undefined>): void;
|
||||
updateField(request: protos.google.firestore.admin.v1.IUpdateFieldRequest, callback: Callback<LROperation<protos.google.firestore.admin.v1.IField, protos.google.firestore.admin.v1.IFieldOperationMetadata>, protos.google.longrunning.IOperation | null | undefined, {} | null | undefined>): void;
|
||||
/**
|
||||
* Check the status of the long running operation returned by `updateField()`.
|
||||
* @param {String} name
|
||||
* The operation name that will be passed.
|
||||
* @returns {Promise} - The promise which resolves to an object.
|
||||
* The decoded operation object has result and metadata field to get information from.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#long-running-operations)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const decodedOperation = await checkUpdateFieldProgress(name);
|
||||
* console.log(decodedOperation.result);
|
||||
* console.log(decodedOperation.done);
|
||||
* console.log(decodedOperation.metadata);
|
||||
*/
|
||||
checkUpdateFieldProgress(name: string): Promise<LROperation<protos.google.firestore.admin.v1.Field, protos.google.firestore.admin.v1.FieldOperationMetadata>>;
|
||||
exportDocuments(request?: protos.google.firestore.admin.v1.IExportDocumentsRequest, options?: CallOptions): Promise<[LROperation<protos.google.firestore.admin.v1.IExportDocumentsResponse, protos.google.firestore.admin.v1.IExportDocumentsMetadata>, protos.google.longrunning.IOperation | undefined, {} | undefined]>;
|
||||
exportDocuments(request: protos.google.firestore.admin.v1.IExportDocumentsRequest, options: CallOptions, callback: Callback<LROperation<protos.google.firestore.admin.v1.IExportDocumentsResponse, protos.google.firestore.admin.v1.IExportDocumentsMetadata>, protos.google.longrunning.IOperation | null | undefined, {} | null | undefined>): void;
|
||||
exportDocuments(request: protos.google.firestore.admin.v1.IExportDocumentsRequest, callback: Callback<LROperation<protos.google.firestore.admin.v1.IExportDocumentsResponse, protos.google.firestore.admin.v1.IExportDocumentsMetadata>, protos.google.longrunning.IOperation | null | undefined, {} | null | undefined>): void;
|
||||
/**
|
||||
* Check the status of the long running operation returned by `exportDocuments()`.
|
||||
* @param {String} name
|
||||
* The operation name that will be passed.
|
||||
* @returns {Promise} - The promise which resolves to an object.
|
||||
* The decoded operation object has result and metadata field to get information from.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#long-running-operations)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const decodedOperation = await checkExportDocumentsProgress(name);
|
||||
* console.log(decodedOperation.result);
|
||||
* console.log(decodedOperation.done);
|
||||
* console.log(decodedOperation.metadata);
|
||||
*/
|
||||
checkExportDocumentsProgress(name: string): Promise<LROperation<protos.google.firestore.admin.v1.ExportDocumentsResponse, protos.google.firestore.admin.v1.ExportDocumentsMetadata>>;
|
||||
importDocuments(request?: protos.google.firestore.admin.v1.IImportDocumentsRequest, options?: CallOptions): Promise<[LROperation<protos.google.protobuf.IEmpty, protos.google.firestore.admin.v1.IImportDocumentsMetadata>, protos.google.longrunning.IOperation | undefined, {} | undefined]>;
|
||||
importDocuments(request: protos.google.firestore.admin.v1.IImportDocumentsRequest, options: CallOptions, callback: Callback<LROperation<protos.google.protobuf.IEmpty, protos.google.firestore.admin.v1.IImportDocumentsMetadata>, protos.google.longrunning.IOperation | null | undefined, {} | null | undefined>): void;
|
||||
importDocuments(request: protos.google.firestore.admin.v1.IImportDocumentsRequest, callback: Callback<LROperation<protos.google.protobuf.IEmpty, protos.google.firestore.admin.v1.IImportDocumentsMetadata>, protos.google.longrunning.IOperation | null | undefined, {} | null | undefined>): void;
|
||||
/**
|
||||
* Check the status of the long running operation returned by `importDocuments()`.
|
||||
* @param {String} name
|
||||
* The operation name that will be passed.
|
||||
* @returns {Promise} - The promise which resolves to an object.
|
||||
* The decoded operation object has result and metadata field to get information from.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#long-running-operations)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const decodedOperation = await checkImportDocumentsProgress(name);
|
||||
* console.log(decodedOperation.result);
|
||||
* console.log(decodedOperation.done);
|
||||
* console.log(decodedOperation.metadata);
|
||||
*/
|
||||
checkImportDocumentsProgress(name: string): Promise<LROperation<protos.google.protobuf.Empty, protos.google.firestore.admin.v1.ImportDocumentsMetadata>>;
|
||||
listIndexes(request?: protos.google.firestore.admin.v1.IListIndexesRequest, options?: CallOptions): Promise<[protos.google.firestore.admin.v1.IIndex[], protos.google.firestore.admin.v1.IListIndexesRequest | null, protos.google.firestore.admin.v1.IListIndexesResponse]>;
|
||||
listIndexes(request: protos.google.firestore.admin.v1.IListIndexesRequest, options: CallOptions, callback: PaginationCallback<protos.google.firestore.admin.v1.IListIndexesRequest, protos.google.firestore.admin.v1.IListIndexesResponse | null | undefined, protos.google.firestore.admin.v1.IIndex>): void;
|
||||
listIndexes(request: protos.google.firestore.admin.v1.IListIndexesRequest, callback: PaginationCallback<protos.google.firestore.admin.v1.IListIndexesRequest, protos.google.firestore.admin.v1.IListIndexesResponse | null | undefined, protos.google.firestore.admin.v1.IIndex>): void;
|
||||
/**
|
||||
* Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. A parent name of the form
|
||||
* `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`
|
||||
* @param {string} request.filter
|
||||
* The filter to apply to list results.
|
||||
* @param {number} request.pageSize
|
||||
* The number of results to return.
|
||||
* @param {string} request.pageToken
|
||||
* A page token, returned from a previous call to
|
||||
* {@link google.firestore.admin.v1.FirestoreAdmin.ListIndexes|FirestoreAdmin.ListIndexes}, that may be used to get the next
|
||||
* page of results.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits an object representing [Index]{@link google.firestore.admin.v1.Index} on 'data' event.
|
||||
* The client library will perform auto-pagination by default: it will call the API as many
|
||||
* times as needed. Note that it can affect your quota.
|
||||
* We recommend using `listIndexesAsync()`
|
||||
* method described below for async iteration which you can stop as needed.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
*/
|
||||
listIndexesStream(request?: protos.google.firestore.admin.v1.IListIndexesRequest, options?: CallOptions): Transform;
|
||||
/**
|
||||
* Equivalent to `listIndexes`, but returns an iterable object.
|
||||
*
|
||||
* `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. A parent name of the form
|
||||
* `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`
|
||||
* @param {string} request.filter
|
||||
* The filter to apply to list results.
|
||||
* @param {number} request.pageSize
|
||||
* The number of results to return.
|
||||
* @param {string} request.pageToken
|
||||
* A page token, returned from a previous call to
|
||||
* {@link google.firestore.admin.v1.FirestoreAdmin.ListIndexes|FirestoreAdmin.ListIndexes}, that may be used to get the next
|
||||
* page of results.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Object}
|
||||
* An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
|
||||
* When you iterate the returned iterable, each element will be an object representing
|
||||
* [Index]{@link google.firestore.admin.v1.Index}. The API will be called under the hood as needed, once per the page,
|
||||
* so you can stop the iteration when you don't need more results.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const iterable = client.listIndexesAsync(request);
|
||||
* for await (const response of iterable) {
|
||||
* // process response
|
||||
* }
|
||||
*/
|
||||
listIndexesAsync(request?: protos.google.firestore.admin.v1.IListIndexesRequest, options?: CallOptions): AsyncIterable<protos.google.firestore.admin.v1.IIndex>;
|
||||
listFields(request?: protos.google.firestore.admin.v1.IListFieldsRequest, options?: CallOptions): Promise<[protos.google.firestore.admin.v1.IField[], protos.google.firestore.admin.v1.IListFieldsRequest | null, protos.google.firestore.admin.v1.IListFieldsResponse]>;
|
||||
listFields(request: protos.google.firestore.admin.v1.IListFieldsRequest, options: CallOptions, callback: PaginationCallback<protos.google.firestore.admin.v1.IListFieldsRequest, protos.google.firestore.admin.v1.IListFieldsResponse | null | undefined, protos.google.firestore.admin.v1.IField>): void;
|
||||
listFields(request: protos.google.firestore.admin.v1.IListFieldsRequest, callback: PaginationCallback<protos.google.firestore.admin.v1.IListFieldsRequest, protos.google.firestore.admin.v1.IListFieldsResponse | null | undefined, protos.google.firestore.admin.v1.IField>): void;
|
||||
/**
|
||||
* Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. A parent name of the form
|
||||
* `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`
|
||||
* @param {string} request.filter
|
||||
* The filter to apply to list results. Currently,
|
||||
* {@link google.firestore.admin.v1.FirestoreAdmin.ListFields|FirestoreAdmin.ListFields} only supports listing fields
|
||||
* that have been explicitly overridden. To issue this query, call
|
||||
* {@link google.firestore.admin.v1.FirestoreAdmin.ListFields|FirestoreAdmin.ListFields} with the filter set to
|
||||
* `indexConfig.usesAncestorConfig:false`.
|
||||
* @param {number} request.pageSize
|
||||
* The number of results to return.
|
||||
* @param {string} request.pageToken
|
||||
* A page token, returned from a previous call to
|
||||
* {@link google.firestore.admin.v1.FirestoreAdmin.ListFields|FirestoreAdmin.ListFields}, that may be used to get the next
|
||||
* page of results.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits an object representing [Field]{@link google.firestore.admin.v1.Field} on 'data' event.
|
||||
* The client library will perform auto-pagination by default: it will call the API as many
|
||||
* times as needed. Note that it can affect your quota.
|
||||
* We recommend using `listFieldsAsync()`
|
||||
* method described below for async iteration which you can stop as needed.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
*/
|
||||
listFieldsStream(request?: protos.google.firestore.admin.v1.IListFieldsRequest, options?: CallOptions): Transform;
|
||||
/**
|
||||
* Equivalent to `listFields`, but returns an iterable object.
|
||||
*
|
||||
* `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. A parent name of the form
|
||||
* `projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`
|
||||
* @param {string} request.filter
|
||||
* The filter to apply to list results. Currently,
|
||||
* {@link google.firestore.admin.v1.FirestoreAdmin.ListFields|FirestoreAdmin.ListFields} only supports listing fields
|
||||
* that have been explicitly overridden. To issue this query, call
|
||||
* {@link google.firestore.admin.v1.FirestoreAdmin.ListFields|FirestoreAdmin.ListFields} with the filter set to
|
||||
* `indexConfig.usesAncestorConfig:false`.
|
||||
* @param {number} request.pageSize
|
||||
* The number of results to return.
|
||||
* @param {string} request.pageToken
|
||||
* A page token, returned from a previous call to
|
||||
* {@link google.firestore.admin.v1.FirestoreAdmin.ListFields|FirestoreAdmin.ListFields}, that may be used to get the next
|
||||
* page of results.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Object}
|
||||
* An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
|
||||
* When you iterate the returned iterable, each element will be an object representing
|
||||
* [Field]{@link google.firestore.admin.v1.Field}. The API will be called under the hood as needed, once per the page,
|
||||
* so you can stop the iteration when you don't need more results.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const iterable = client.listFieldsAsync(request);
|
||||
* for await (const response of iterable) {
|
||||
* // process response
|
||||
* }
|
||||
*/
|
||||
listFieldsAsync(request?: protos.google.firestore.admin.v1.IListFieldsRequest, options?: CallOptions): AsyncIterable<protos.google.firestore.admin.v1.IField>;
|
||||
/**
|
||||
* Return a fully-qualified collectionGroup resource name string.
|
||||
*
|
||||
* @param {string} project
|
||||
* @param {string} database
|
||||
* @param {string} collection
|
||||
* @returns {string} Resource name string.
|
||||
*/
|
||||
collectionGroupPath(project: string, database: string, collection: string): string;
|
||||
/**
|
||||
* Parse the project from CollectionGroup resource.
|
||||
*
|
||||
* @param {string} collectionGroupName
|
||||
* A fully-qualified path representing CollectionGroup resource.
|
||||
* @returns {string} A string representing the project.
|
||||
*/
|
||||
matchProjectFromCollectionGroupName(collectionGroupName: string): string | number;
|
||||
/**
|
||||
* Parse the database from CollectionGroup resource.
|
||||
*
|
||||
* @param {string} collectionGroupName
|
||||
* A fully-qualified path representing CollectionGroup resource.
|
||||
* @returns {string} A string representing the database.
|
||||
*/
|
||||
matchDatabaseFromCollectionGroupName(collectionGroupName: string): string | number;
|
||||
/**
|
||||
* Parse the collection from CollectionGroup resource.
|
||||
*
|
||||
* @param {string} collectionGroupName
|
||||
* A fully-qualified path representing CollectionGroup resource.
|
||||
* @returns {string} A string representing the collection.
|
||||
*/
|
||||
matchCollectionFromCollectionGroupName(collectionGroupName: string): string | number;
|
||||
/**
|
||||
* Return a fully-qualified database resource name string.
|
||||
*
|
||||
* @param {string} project
|
||||
* @param {string} database
|
||||
* @returns {string} Resource name string.
|
||||
*/
|
||||
databasePath(project: string, database: string): string;
|
||||
/**
|
||||
* Parse the project from Database resource.
|
||||
*
|
||||
* @param {string} databaseName
|
||||
* A fully-qualified path representing Database resource.
|
||||
* @returns {string} A string representing the project.
|
||||
*/
|
||||
matchProjectFromDatabaseName(databaseName: string): string | number;
|
||||
/**
|
||||
* Parse the database from Database resource.
|
||||
*
|
||||
* @param {string} databaseName
|
||||
* A fully-qualified path representing Database resource.
|
||||
* @returns {string} A string representing the database.
|
||||
*/
|
||||
matchDatabaseFromDatabaseName(databaseName: string): string | number;
|
||||
/**
|
||||
* Return a fully-qualified field resource name string.
|
||||
*
|
||||
* @param {string} project
|
||||
* @param {string} database
|
||||
* @param {string} collection
|
||||
* @param {string} field
|
||||
* @returns {string} Resource name string.
|
||||
*/
|
||||
fieldPath(project: string, database: string, collection: string, field: string): string;
|
||||
/**
|
||||
* Parse the project from Field resource.
|
||||
*
|
||||
* @param {string} fieldName
|
||||
* A fully-qualified path representing Field resource.
|
||||
* @returns {string} A string representing the project.
|
||||
*/
|
||||
matchProjectFromFieldName(fieldName: string): string | number;
|
||||
/**
|
||||
* Parse the database from Field resource.
|
||||
*
|
||||
* @param {string} fieldName
|
||||
* A fully-qualified path representing Field resource.
|
||||
* @returns {string} A string representing the database.
|
||||
*/
|
||||
matchDatabaseFromFieldName(fieldName: string): string | number;
|
||||
/**
|
||||
* Parse the collection from Field resource.
|
||||
*
|
||||
* @param {string} fieldName
|
||||
* A fully-qualified path representing Field resource.
|
||||
* @returns {string} A string representing the collection.
|
||||
*/
|
||||
matchCollectionFromFieldName(fieldName: string): string | number;
|
||||
/**
|
||||
* Parse the field from Field resource.
|
||||
*
|
||||
* @param {string} fieldName
|
||||
* A fully-qualified path representing Field resource.
|
||||
* @returns {string} A string representing the field.
|
||||
*/
|
||||
matchFieldFromFieldName(fieldName: string): string | number;
|
||||
/**
|
||||
* Return a fully-qualified index resource name string.
|
||||
*
|
||||
* @param {string} project
|
||||
* @param {string} database
|
||||
* @param {string} collection
|
||||
* @param {string} index
|
||||
* @returns {string} Resource name string.
|
||||
*/
|
||||
indexPath(project: string, database: string, collection: string, index: string): string;
|
||||
/**
|
||||
* Parse the project from Index resource.
|
||||
*
|
||||
* @param {string} indexName
|
||||
* A fully-qualified path representing Index resource.
|
||||
* @returns {string} A string representing the project.
|
||||
*/
|
||||
matchProjectFromIndexName(indexName: string): string | number;
|
||||
/**
|
||||
* Parse the database from Index resource.
|
||||
*
|
||||
* @param {string} indexName
|
||||
* A fully-qualified path representing Index resource.
|
||||
* @returns {string} A string representing the database.
|
||||
*/
|
||||
matchDatabaseFromIndexName(indexName: string): string | number;
|
||||
/**
|
||||
* Parse the collection from Index resource.
|
||||
*
|
||||
* @param {string} indexName
|
||||
* A fully-qualified path representing Index resource.
|
||||
* @returns {string} A string representing the collection.
|
||||
*/
|
||||
matchCollectionFromIndexName(indexName: string): string | number;
|
||||
/**
|
||||
* Parse the index from Index resource.
|
||||
*
|
||||
* @param {string} indexName
|
||||
* A fully-qualified path representing Index resource.
|
||||
* @returns {string} A string representing the index.
|
||||
*/
|
||||
matchIndexFromIndexName(indexName: string): string | number;
|
||||
/**
|
||||
* Terminate the gRPC channel and close the client.
|
||||
*
|
||||
* The client will no longer be usable and all future behavior is undefined.
|
||||
* @returns {Promise} A promise that resolves when the client is closed.
|
||||
*/
|
||||
close(): Promise<void>;
|
||||
}
|
||||
+1188
File diff suppressed because it is too large
Load Diff
Generated
Vendored
+76
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"interfaces": {
|
||||
"google.firestore.admin.v1.FirestoreAdmin": {
|
||||
"retry_codes": {
|
||||
"non_idempotent": [],
|
||||
"idempotent": [
|
||||
"DEADLINE_EXCEEDED",
|
||||
"UNAVAILABLE"
|
||||
],
|
||||
"deadline_exceeded_internal_unavailable": [
|
||||
"DEADLINE_EXCEEDED",
|
||||
"INTERNAL",
|
||||
"UNAVAILABLE"
|
||||
]
|
||||
},
|
||||
"retry_params": {
|
||||
"default": {
|
||||
"initial_retry_delay_millis": 100,
|
||||
"retry_delay_multiplier": 1.3,
|
||||
"max_retry_delay_millis": 60000,
|
||||
"initial_rpc_timeout_millis": 60000,
|
||||
"rpc_timeout_multiplier": 1,
|
||||
"max_rpc_timeout_millis": 60000,
|
||||
"total_timeout_millis": 600000
|
||||
}
|
||||
},
|
||||
"methods": {
|
||||
"CreateIndex": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "non_idempotent",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"ListIndexes": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"GetIndex": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"DeleteIndex": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"GetField": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"UpdateField": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "non_idempotent",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"ListFields": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"ExportDocuments": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "non_idempotent",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"ImportDocuments": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "non_idempotent",
|
||||
"retry_params_name": "default"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
[
|
||||
"../../protos/google/firestore/admin/v1/field.proto",
|
||||
"../../protos/google/firestore/admin/v1/firestore_admin.proto",
|
||||
"../../protos/google/firestore/admin/v1/index.proto",
|
||||
"../../protos/google/firestore/admin/v1/location.proto",
|
||||
"../../protos/google/firestore/admin/v1/operation.proto"
|
||||
]
|
||||
+559
@@ -0,0 +1,559 @@
|
||||
/// <reference types="node" />
|
||||
import * as gax from 'google-gax';
|
||||
import { Callback, CallOptions, Descriptors, ClientOptions, PaginationCallback } from 'google-gax';
|
||||
import { Transform } from 'stream';
|
||||
import * as protos from '../../protos/firestore_v1_proto_api';
|
||||
/**
|
||||
* The Cloud Firestore service.
|
||||
*
|
||||
* Cloud Firestore is a fast, fully managed, serverless, cloud-native NoSQL
|
||||
* document database that simplifies storing, syncing, and querying data for
|
||||
* your mobile, web, and IoT apps at global scale. Its client libraries provide
|
||||
* live synchronization and offline support, while its security features and
|
||||
* integrations with Firebase and Google Cloud Platform (GCP) accelerate
|
||||
* building truly serverless apps.
|
||||
* @class
|
||||
* @memberof v1
|
||||
*/
|
||||
export declare class FirestoreClient {
|
||||
private _terminated;
|
||||
private _opts;
|
||||
private _providedCustomServicePath;
|
||||
private _gaxModule;
|
||||
private _gaxGrpc;
|
||||
private _protos;
|
||||
private _defaults;
|
||||
auth: gax.GoogleAuth;
|
||||
descriptors: Descriptors;
|
||||
warn: (code: string, message: string, warnType?: string) => void;
|
||||
innerApiCalls: {
|
||||
[name: string]: Function;
|
||||
};
|
||||
firestoreStub?: Promise<{
|
||||
[name: string]: Function;
|
||||
}>;
|
||||
/**
|
||||
* Construct an instance of FirestoreClient.
|
||||
*
|
||||
* @param {object} [options] - The configuration object.
|
||||
* The options accepted by the constructor are described in detail
|
||||
* in [this document](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#creating-the-client-instance).
|
||||
* The common options are:
|
||||
* @param {object} [options.credentials] - Credentials object.
|
||||
* @param {string} [options.credentials.client_email]
|
||||
* @param {string} [options.credentials.private_key]
|
||||
* @param {string} [options.email] - Account email address. Required when
|
||||
* using a .pem or .p12 keyFilename.
|
||||
* @param {string} [options.keyFilename] - Full path to the a .json, .pem, or
|
||||
* .p12 key downloaded from the Google Developers Console. If you provide
|
||||
* a path to a JSON file, the projectId option below is not necessary.
|
||||
* NOTE: .pem and .p12 require you to specify options.email as well.
|
||||
* @param {number} [options.port] - The port on which to connect to
|
||||
* the remote host.
|
||||
* @param {string} [options.projectId] - The project ID from the Google
|
||||
* Developer's Console, e.g. 'grape-spaceship-123'. We will also check
|
||||
* the environment variable GCLOUD_PROJECT for your project ID. If your
|
||||
* app is running in an environment which supports
|
||||
* {@link https://developers.google.com/identity/protocols/application-default-credentials Application Default Credentials},
|
||||
* your project ID will be detected automatically.
|
||||
* @param {string} [options.apiEndpoint] - The domain name of the
|
||||
* API remote host.
|
||||
* @param {gax.ClientConfig} [options.clientConfig] - Client configuration override.
|
||||
* Follows the structure of {@link gapicConfig}.
|
||||
* @param {boolean} [options.fallback] - Use HTTP fallback mode.
|
||||
* In fallback mode, a special browser-compatible transport implementation is used
|
||||
* instead of gRPC transport. In browser context (if the `window` object is defined)
|
||||
* the fallback mode is enabled automatically; set `options.fallback` to `false`
|
||||
* if you need to override this behavior.
|
||||
*/
|
||||
constructor(opts?: ClientOptions);
|
||||
/**
|
||||
* Initialize the client.
|
||||
* Performs asynchronous operations (such as authentication) and prepares the client.
|
||||
* This function will be called automatically when any class method is called for the
|
||||
* first time, but if you need to initialize it before calling an actual method,
|
||||
* feel free to call initialize() directly.
|
||||
*
|
||||
* You can await on this method if you want to make sure the client is initialized.
|
||||
*
|
||||
* @returns {Promise} A promise that resolves to an authenticated service stub.
|
||||
*/
|
||||
initialize(): Promise<{
|
||||
[name: string]: Function;
|
||||
}>;
|
||||
/**
|
||||
* The DNS address for this API service.
|
||||
* @returns {string} The DNS address for this service.
|
||||
*/
|
||||
static get servicePath(): string;
|
||||
/**
|
||||
* The DNS address for this API service - same as servicePath(),
|
||||
* exists for compatibility reasons.
|
||||
* @returns {string} The DNS address for this service.
|
||||
*/
|
||||
static get apiEndpoint(): string;
|
||||
/**
|
||||
* The port for this API service.
|
||||
* @returns {number} The default port for this service.
|
||||
*/
|
||||
static get port(): number;
|
||||
/**
|
||||
* The scopes needed to make gRPC calls for every method defined
|
||||
* in this service.
|
||||
* @returns {string[]} List of default scopes.
|
||||
*/
|
||||
static get scopes(): string[];
|
||||
getProjectId(): Promise<string>;
|
||||
getProjectId(callback: Callback<string, undefined, undefined>): void;
|
||||
getDocument(request?: protos.google.firestore.v1.IGetDocumentRequest, options?: CallOptions): Promise<[protos.google.firestore.v1.IDocument, protos.google.firestore.v1.IGetDocumentRequest | undefined, {} | undefined]>;
|
||||
getDocument(request: protos.google.firestore.v1.IGetDocumentRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1.IDocument, protos.google.firestore.v1.IGetDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
getDocument(request: protos.google.firestore.v1.IGetDocumentRequest, callback: Callback<protos.google.firestore.v1.IDocument, protos.google.firestore.v1.IGetDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
updateDocument(request?: protos.google.firestore.v1.IUpdateDocumentRequest, options?: CallOptions): Promise<[protos.google.firestore.v1.IDocument, protos.google.firestore.v1.IUpdateDocumentRequest | undefined, {} | undefined]>;
|
||||
updateDocument(request: protos.google.firestore.v1.IUpdateDocumentRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1.IDocument, protos.google.firestore.v1.IUpdateDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
updateDocument(request: protos.google.firestore.v1.IUpdateDocumentRequest, callback: Callback<protos.google.firestore.v1.IDocument, protos.google.firestore.v1.IUpdateDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
deleteDocument(request?: protos.google.firestore.v1.IDeleteDocumentRequest, options?: CallOptions): Promise<[protos.google.protobuf.IEmpty, protos.google.firestore.v1.IDeleteDocumentRequest | undefined, {} | undefined]>;
|
||||
deleteDocument(request: protos.google.firestore.v1.IDeleteDocumentRequest, options: CallOptions, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.v1.IDeleteDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
deleteDocument(request: protos.google.firestore.v1.IDeleteDocumentRequest, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.v1.IDeleteDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
beginTransaction(request?: protos.google.firestore.v1.IBeginTransactionRequest, options?: CallOptions): Promise<[protos.google.firestore.v1.IBeginTransactionResponse, protos.google.firestore.v1.IBeginTransactionRequest | undefined, {} | undefined]>;
|
||||
beginTransaction(request: protos.google.firestore.v1.IBeginTransactionRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1.IBeginTransactionResponse, protos.google.firestore.v1.IBeginTransactionRequest | null | undefined, {} | null | undefined>): void;
|
||||
beginTransaction(request: protos.google.firestore.v1.IBeginTransactionRequest, callback: Callback<protos.google.firestore.v1.IBeginTransactionResponse, protos.google.firestore.v1.IBeginTransactionRequest | null | undefined, {} | null | undefined>): void;
|
||||
commit(request?: protos.google.firestore.v1.ICommitRequest, options?: CallOptions): Promise<[protos.google.firestore.v1.ICommitResponse, protos.google.firestore.v1.ICommitRequest | undefined, {} | undefined]>;
|
||||
commit(request: protos.google.firestore.v1.ICommitRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1.ICommitResponse, protos.google.firestore.v1.ICommitRequest | null | undefined, {} | null | undefined>): void;
|
||||
commit(request: protos.google.firestore.v1.ICommitRequest, callback: Callback<protos.google.firestore.v1.ICommitResponse, protos.google.firestore.v1.ICommitRequest | null | undefined, {} | null | undefined>): void;
|
||||
rollback(request?: protos.google.firestore.v1.IRollbackRequest, options?: CallOptions): Promise<[protos.google.protobuf.IEmpty, protos.google.firestore.v1.IRollbackRequest | undefined, {} | undefined]>;
|
||||
rollback(request: protos.google.firestore.v1.IRollbackRequest, options: CallOptions, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.v1.IRollbackRequest | null | undefined, {} | null | undefined>): void;
|
||||
rollback(request: protos.google.firestore.v1.IRollbackRequest, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.v1.IRollbackRequest | null | undefined, {} | null | undefined>): void;
|
||||
batchWrite(request?: protos.google.firestore.v1.IBatchWriteRequest, options?: CallOptions): Promise<[protos.google.firestore.v1.IBatchWriteResponse, protos.google.firestore.v1.IBatchWriteRequest | undefined, {} | undefined]>;
|
||||
batchWrite(request: protos.google.firestore.v1.IBatchWriteRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1.IBatchWriteResponse, protos.google.firestore.v1.IBatchWriteRequest | null | undefined, {} | null | undefined>): void;
|
||||
batchWrite(request: protos.google.firestore.v1.IBatchWriteRequest, callback: Callback<protos.google.firestore.v1.IBatchWriteResponse, protos.google.firestore.v1.IBatchWriteRequest | null | undefined, {} | null | undefined>): void;
|
||||
createDocument(request?: protos.google.firestore.v1.ICreateDocumentRequest, options?: CallOptions): Promise<[protos.google.firestore.v1.IDocument, protos.google.firestore.v1.ICreateDocumentRequest | undefined, {} | undefined]>;
|
||||
createDocument(request: protos.google.firestore.v1.ICreateDocumentRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1.IDocument, protos.google.firestore.v1.ICreateDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
createDocument(request: protos.google.firestore.v1.ICreateDocumentRequest, callback: Callback<protos.google.firestore.v1.IDocument, protos.google.firestore.v1.ICreateDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
/**
|
||||
* Gets multiple documents.
|
||||
*
|
||||
* Documents returned by this method are not guaranteed to be returned in the
|
||||
* same order that they were requested.
|
||||
*
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.database
|
||||
* Required. The database name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}`.
|
||||
* @param {string[]} request.documents
|
||||
* The names of the documents to retrieve. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* The request will fail if any of the document is not a child resource of the
|
||||
* given `database`. Duplicate names will be elided.
|
||||
* @param {google.firestore.v1.DocumentMask} request.mask
|
||||
* The fields to return. If not set, returns all fields.
|
||||
*
|
||||
* If a document has a field that is not present in this mask, that field will
|
||||
* not be returned in the response.
|
||||
* @param {Buffer} request.transaction
|
||||
* Reads documents in a transaction.
|
||||
* @param {google.firestore.v1.TransactionOptions} request.newTransaction
|
||||
* Starts a new transaction and reads the documents.
|
||||
* Defaults to a read-only transaction.
|
||||
* The new transaction ID will be returned as the first response in the
|
||||
* stream.
|
||||
* @param {google.protobuf.Timestamp} request.readTime
|
||||
* Reads documents as they were at the given time.
|
||||
* This may not be older than 270 seconds.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits [BatchGetDocumentsResponse]{@link google.firestore.v1.BatchGetDocumentsResponse} on 'data' event.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#server-streaming)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const stream = client.batchGetDocuments(request);
|
||||
* stream.on('data', (response) => { ... });
|
||||
* stream.on('end', () => { ... });
|
||||
*/
|
||||
batchGetDocuments(request?: protos.google.firestore.v1.IBatchGetDocumentsRequest, options?: CallOptions): gax.CancellableStream;
|
||||
/**
|
||||
* Runs a query.
|
||||
*
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents` or
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents` or
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {google.firestore.v1.StructuredQuery} request.structuredQuery
|
||||
* A structured query.
|
||||
* @param {Buffer} request.transaction
|
||||
* Reads documents in a transaction.
|
||||
* @param {google.firestore.v1.TransactionOptions} request.newTransaction
|
||||
* Starts a new transaction and reads the documents.
|
||||
* Defaults to a read-only transaction.
|
||||
* The new transaction ID will be returned as the first response in the
|
||||
* stream.
|
||||
* @param {google.protobuf.Timestamp} request.readTime
|
||||
* Reads documents as they were at the given time.
|
||||
* This may not be older than 270 seconds.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits [RunQueryResponse]{@link google.firestore.v1.RunQueryResponse} on 'data' event.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#server-streaming)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const stream = client.runQuery(request);
|
||||
* stream.on('data', (response) => { ... });
|
||||
* stream.on('end', () => { ... });
|
||||
*/
|
||||
runQuery(request?: protos.google.firestore.v1.IRunQueryRequest, options?: CallOptions): gax.CancellableStream;
|
||||
/**
|
||||
* Streams batches of document updates and deletes, in order.
|
||||
*
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which is both readable and writable. It accepts objects
|
||||
* representing [WriteRequest]{@link google.firestore.v1.WriteRequest} for write() method, and
|
||||
* will emit objects representing [WriteResponse]{@link google.firestore.v1.WriteResponse} on 'data' event asynchronously.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#bi-directional-streaming)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const stream = client.write();
|
||||
* stream.on('data', (response) => { ... });
|
||||
* stream.on('end', () => { ... });
|
||||
* stream.write(request);
|
||||
* stream.end();
|
||||
*/
|
||||
write(options?: CallOptions): gax.CancellableStream;
|
||||
/**
|
||||
* Listens to changes.
|
||||
*
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which is both readable and writable. It accepts objects
|
||||
* representing [ListenRequest]{@link google.firestore.v1.ListenRequest} for write() method, and
|
||||
* will emit objects representing [ListenResponse]{@link google.firestore.v1.ListenResponse} on 'data' event asynchronously.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#bi-directional-streaming)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const stream = client.listen();
|
||||
* stream.on('data', (response) => { ... });
|
||||
* stream.on('end', () => { ... });
|
||||
* stream.write(request);
|
||||
* stream.end();
|
||||
*/
|
||||
listen(options?: CallOptions): gax.CancellableStream;
|
||||
listDocuments(request?: protos.google.firestore.v1.IListDocumentsRequest, options?: CallOptions): Promise<[protos.google.firestore.v1.IDocument[], protos.google.firestore.v1.IListDocumentsRequest | null, protos.google.firestore.v1.IListDocumentsResponse]>;
|
||||
listDocuments(request: protos.google.firestore.v1.IListDocumentsRequest, options: CallOptions, callback: PaginationCallback<protos.google.firestore.v1.IListDocumentsRequest, protos.google.firestore.v1.IListDocumentsResponse | null | undefined, protos.google.firestore.v1.IDocument>): void;
|
||||
listDocuments(request: protos.google.firestore.v1.IListDocumentsRequest, callback: PaginationCallback<protos.google.firestore.v1.IListDocumentsRequest, protos.google.firestore.v1.IListDocumentsResponse | null | undefined, protos.google.firestore.v1.IDocument>): void;
|
||||
/**
|
||||
* Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents` or
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents` or
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {string} request.collectionId
|
||||
* Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`
|
||||
* or `messages`.
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of documents to return.
|
||||
* @param {string} request.pageToken
|
||||
* The `next_page_token` value returned from a previous List request, if any.
|
||||
* @param {string} request.orderBy
|
||||
* The order to sort results by. For example: `priority desc, name`.
|
||||
* @param {google.firestore.v1.DocumentMask} request.mask
|
||||
* The fields to return. If not set, returns all fields.
|
||||
*
|
||||
* If a document has a field that is not present in this mask, that field
|
||||
* will not be returned in the response.
|
||||
* @param {Buffer} request.transaction
|
||||
* Reads documents in a transaction.
|
||||
* @param {google.protobuf.Timestamp} request.readTime
|
||||
* Reads documents as they were at the given time.
|
||||
* This may not be older than 270 seconds.
|
||||
* @param {boolean} request.showMissing
|
||||
* If the list should show missing documents. A missing document is a
|
||||
* document that does not exist but has sub-documents. These documents will
|
||||
* be returned with a key but will not have fields, {@link google.firestore.v1.Document.create_time|Document.create_time},
|
||||
* or {@link google.firestore.v1.Document.update_time|Document.update_time} set.
|
||||
*
|
||||
* Requests with `show_missing` may not specify `where` or
|
||||
* `order_by`.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits an object representing [Document]{@link google.firestore.v1.Document} on 'data' event.
|
||||
* The client library will perform auto-pagination by default: it will call the API as many
|
||||
* times as needed. Note that it can affect your quota.
|
||||
* We recommend using `listDocumentsAsync()`
|
||||
* method described below for async iteration which you can stop as needed.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
*/
|
||||
listDocumentsStream(request?: protos.google.firestore.v1.IListDocumentsRequest, options?: CallOptions): Transform;
|
||||
/**
|
||||
* Equivalent to `listDocuments`, but returns an iterable object.
|
||||
*
|
||||
* `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents` or
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents` or
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {string} request.collectionId
|
||||
* Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`
|
||||
* or `messages`.
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of documents to return.
|
||||
* @param {string} request.pageToken
|
||||
* The `next_page_token` value returned from a previous List request, if any.
|
||||
* @param {string} request.orderBy
|
||||
* The order to sort results by. For example: `priority desc, name`.
|
||||
* @param {google.firestore.v1.DocumentMask} request.mask
|
||||
* The fields to return. If not set, returns all fields.
|
||||
*
|
||||
* If a document has a field that is not present in this mask, that field
|
||||
* will not be returned in the response.
|
||||
* @param {Buffer} request.transaction
|
||||
* Reads documents in a transaction.
|
||||
* @param {google.protobuf.Timestamp} request.readTime
|
||||
* Reads documents as they were at the given time.
|
||||
* This may not be older than 270 seconds.
|
||||
* @param {boolean} request.showMissing
|
||||
* If the list should show missing documents. A missing document is a
|
||||
* document that does not exist but has sub-documents. These documents will
|
||||
* be returned with a key but will not have fields, {@link google.firestore.v1.Document.create_time|Document.create_time},
|
||||
* or {@link google.firestore.v1.Document.update_time|Document.update_time} set.
|
||||
*
|
||||
* Requests with `show_missing` may not specify `where` or
|
||||
* `order_by`.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Object}
|
||||
* An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
|
||||
* When you iterate the returned iterable, each element will be an object representing
|
||||
* [Document]{@link google.firestore.v1.Document}. The API will be called under the hood as needed, once per the page,
|
||||
* so you can stop the iteration when you don't need more results.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const iterable = client.listDocumentsAsync(request);
|
||||
* for await (const response of iterable) {
|
||||
* // process response
|
||||
* }
|
||||
*/
|
||||
listDocumentsAsync(request?: protos.google.firestore.v1.IListDocumentsRequest, options?: CallOptions): AsyncIterable<protos.google.firestore.v1.IDocument>;
|
||||
partitionQuery(request?: protos.google.firestore.v1.IPartitionQueryRequest, options?: CallOptions): Promise<[protos.google.firestore.v1.ICursor[], protos.google.firestore.v1.IPartitionQueryRequest | null, protos.google.firestore.v1.IPartitionQueryResponse]>;
|
||||
partitionQuery(request: protos.google.firestore.v1.IPartitionQueryRequest, options: CallOptions, callback: PaginationCallback<protos.google.firestore.v1.IPartitionQueryRequest, protos.google.firestore.v1.IPartitionQueryResponse | null | undefined, protos.google.firestore.v1.ICursor>): void;
|
||||
partitionQuery(request: protos.google.firestore.v1.IPartitionQueryRequest, callback: PaginationCallback<protos.google.firestore.v1.IPartitionQueryRequest, protos.google.firestore.v1.IPartitionQueryResponse | null | undefined, protos.google.firestore.v1.ICursor>): void;
|
||||
/**
|
||||
* Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents`.
|
||||
* Document resource names are not supported; only database resource names
|
||||
* can be specified.
|
||||
* @param {google.firestore.v1.StructuredQuery} request.structuredQuery
|
||||
* A structured query.
|
||||
* Query must specify collection with all descendants and be ordered by name
|
||||
* ascending. Other filters, order bys, limits, offsets, and start/end
|
||||
* cursors are not supported.
|
||||
* @param {number} request.partitionCount
|
||||
* The desired maximum number of partition points.
|
||||
* The partitions may be returned across multiple pages of results.
|
||||
* The number must be positive. The actual number of partitions
|
||||
* returned may be fewer.
|
||||
*
|
||||
* For example, this may be set to one fewer than the number of parallel
|
||||
* queries to be run, or in running a data pipeline job, one fewer than the
|
||||
* number of workers or compute instances available.
|
||||
* @param {string} request.pageToken
|
||||
* The `next_page_token` value returned from a previous call to
|
||||
* PartitionQuery that may be used to get an additional set of results.
|
||||
* There are no ordering guarantees between sets of results. Thus, using
|
||||
* multiple sets of results will require merging the different result sets.
|
||||
*
|
||||
* For example, two subsequent calls using a page_token may return:
|
||||
*
|
||||
* * cursor B, cursor M, cursor Q
|
||||
* * cursor A, cursor U, cursor W
|
||||
*
|
||||
* To obtain a complete result set ordered with respect to the results of the
|
||||
* query supplied to PartitionQuery, the results sets should be merged:
|
||||
* cursor A, cursor B, cursor M, cursor Q, cursor U, cursor W
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of partitions to return in this call, subject to
|
||||
* `partition_count`.
|
||||
*
|
||||
* For example, if `partition_count` = 10 and `page_size` = 8, the first call
|
||||
* to PartitionQuery will return up to 8 partitions and a `next_page_token`
|
||||
* if more results exist. A second call to PartitionQuery will return up to
|
||||
* 2 partitions, to complete the total of 10 specified in `partition_count`.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits an object representing [Cursor]{@link google.firestore.v1.Cursor} on 'data' event.
|
||||
* The client library will perform auto-pagination by default: it will call the API as many
|
||||
* times as needed. Note that it can affect your quota.
|
||||
* We recommend using `partitionQueryAsync()`
|
||||
* method described below for async iteration which you can stop as needed.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
*/
|
||||
partitionQueryStream(request?: protos.google.firestore.v1.IPartitionQueryRequest, options?: CallOptions): Transform;
|
||||
/**
|
||||
* Equivalent to `partitionQuery`, but returns an iterable object.
|
||||
*
|
||||
* `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents`.
|
||||
* Document resource names are not supported; only database resource names
|
||||
* can be specified.
|
||||
* @param {google.firestore.v1.StructuredQuery} request.structuredQuery
|
||||
* A structured query.
|
||||
* Query must specify collection with all descendants and be ordered by name
|
||||
* ascending. Other filters, order bys, limits, offsets, and start/end
|
||||
* cursors are not supported.
|
||||
* @param {number} request.partitionCount
|
||||
* The desired maximum number of partition points.
|
||||
* The partitions may be returned across multiple pages of results.
|
||||
* The number must be positive. The actual number of partitions
|
||||
* returned may be fewer.
|
||||
*
|
||||
* For example, this may be set to one fewer than the number of parallel
|
||||
* queries to be run, or in running a data pipeline job, one fewer than the
|
||||
* number of workers or compute instances available.
|
||||
* @param {string} request.pageToken
|
||||
* The `next_page_token` value returned from a previous call to
|
||||
* PartitionQuery that may be used to get an additional set of results.
|
||||
* There are no ordering guarantees between sets of results. Thus, using
|
||||
* multiple sets of results will require merging the different result sets.
|
||||
*
|
||||
* For example, two subsequent calls using a page_token may return:
|
||||
*
|
||||
* * cursor B, cursor M, cursor Q
|
||||
* * cursor A, cursor U, cursor W
|
||||
*
|
||||
* To obtain a complete result set ordered with respect to the results of the
|
||||
* query supplied to PartitionQuery, the results sets should be merged:
|
||||
* cursor A, cursor B, cursor M, cursor Q, cursor U, cursor W
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of partitions to return in this call, subject to
|
||||
* `partition_count`.
|
||||
*
|
||||
* For example, if `partition_count` = 10 and `page_size` = 8, the first call
|
||||
* to PartitionQuery will return up to 8 partitions and a `next_page_token`
|
||||
* if more results exist. A second call to PartitionQuery will return up to
|
||||
* 2 partitions, to complete the total of 10 specified in `partition_count`.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Object}
|
||||
* An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
|
||||
* When you iterate the returned iterable, each element will be an object representing
|
||||
* [Cursor]{@link google.firestore.v1.Cursor}. The API will be called under the hood as needed, once per the page,
|
||||
* so you can stop the iteration when you don't need more results.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const iterable = client.partitionQueryAsync(request);
|
||||
* for await (const response of iterable) {
|
||||
* // process response
|
||||
* }
|
||||
*/
|
||||
partitionQueryAsync(request?: protos.google.firestore.v1.IPartitionQueryRequest, options?: CallOptions): AsyncIterable<protos.google.firestore.v1.ICursor>;
|
||||
listCollectionIds(request?: protos.google.firestore.v1.IListCollectionIdsRequest, options?: CallOptions): Promise<[string[], protos.google.firestore.v1.IListCollectionIdsRequest | null, protos.google.firestore.v1.IListCollectionIdsResponse]>;
|
||||
listCollectionIds(request: protos.google.firestore.v1.IListCollectionIdsRequest, options: CallOptions, callback: PaginationCallback<protos.google.firestore.v1.IListCollectionIdsRequest, protos.google.firestore.v1.IListCollectionIdsResponse | null | undefined, string>): void;
|
||||
listCollectionIds(request: protos.google.firestore.v1.IListCollectionIdsRequest, callback: PaginationCallback<protos.google.firestore.v1.IListCollectionIdsRequest, protos.google.firestore.v1.IListCollectionIdsResponse | null | undefined, string>): void;
|
||||
/**
|
||||
* Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent document. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of results to return.
|
||||
* @param {string} request.pageToken
|
||||
* A page token. Must be a value from
|
||||
* {@link google.firestore.v1.ListCollectionIdsResponse|ListCollectionIdsResponse}.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits an object representing string on 'data' event.
|
||||
* The client library will perform auto-pagination by default: it will call the API as many
|
||||
* times as needed. Note that it can affect your quota.
|
||||
* We recommend using `listCollectionIdsAsync()`
|
||||
* method described below for async iteration which you can stop as needed.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
*/
|
||||
listCollectionIdsStream(request?: protos.google.firestore.v1.IListCollectionIdsRequest, options?: CallOptions): Transform;
|
||||
/**
|
||||
* Equivalent to `listCollectionIds`, but returns an iterable object.
|
||||
*
|
||||
* `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent document. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of results to return.
|
||||
* @param {string} request.pageToken
|
||||
* A page token. Must be a value from
|
||||
* {@link google.firestore.v1.ListCollectionIdsResponse|ListCollectionIdsResponse}.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Object}
|
||||
* An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
|
||||
* When you iterate the returned iterable, each element will be an object representing
|
||||
* string. The API will be called under the hood as needed, once per the page,
|
||||
* so you can stop the iteration when you don't need more results.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const iterable = client.listCollectionIdsAsync(request);
|
||||
* for await (const response of iterable) {
|
||||
* // process response
|
||||
* }
|
||||
*/
|
||||
listCollectionIdsAsync(request?: protos.google.firestore.v1.IListCollectionIdsRequest, options?: CallOptions): AsyncIterable<string>;
|
||||
/**
|
||||
* Terminate the gRPC channel and close the client.
|
||||
*
|
||||
* The client will no longer be usable and all future behavior is undefined.
|
||||
* @returns {Promise} A promise that resolves when the client is closed.
|
||||
*/
|
||||
close(): Promise<void>;
|
||||
}
|
||||
+1368
File diff suppressed because it is too large
Load Diff
+116
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"interfaces": {
|
||||
"google.firestore.v1.Firestore": {
|
||||
"retry_codes": {
|
||||
"non_idempotent": [],
|
||||
"idempotent": [
|
||||
"DEADLINE_EXCEEDED",
|
||||
"UNAVAILABLE"
|
||||
],
|
||||
"deadline_exceeded_resource_exhausted_internal_unavailable": [
|
||||
"DEADLINE_EXCEEDED",
|
||||
"RESOURCE_EXHAUSTED",
|
||||
"INTERNAL",
|
||||
"UNAVAILABLE"
|
||||
],
|
||||
"resource_exhausted_unavailable": [
|
||||
"RESOURCE_EXHAUSTED",
|
||||
"UNAVAILABLE"
|
||||
],
|
||||
"resource_exhausted_aborted_unavailable": [
|
||||
"RESOURCE_EXHAUSTED",
|
||||
"ABORTED",
|
||||
"UNAVAILABLE"
|
||||
]
|
||||
},
|
||||
"retry_params": {
|
||||
"default": {
|
||||
"initial_retry_delay_millis": 100,
|
||||
"retry_delay_multiplier": 1.3,
|
||||
"max_retry_delay_millis": 60000,
|
||||
"initial_rpc_timeout_millis": 60000,
|
||||
"rpc_timeout_multiplier": 1,
|
||||
"max_rpc_timeout_millis": 60000,
|
||||
"total_timeout_millis": 600000
|
||||
}
|
||||
},
|
||||
"methods": {
|
||||
"GetDocument": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"ListDocuments": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"UpdateDocument": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "resource_exhausted_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"DeleteDocument": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"BatchGetDocuments": {
|
||||
"timeout_millis": 300000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"BeginTransaction": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"Commit": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "resource_exhausted_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"Rollback": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"RunQuery": {
|
||||
"timeout_millis": 300000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"PartitionQuery": {
|
||||
"timeout_millis": 300000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"Write": {
|
||||
"timeout_millis": 86400000,
|
||||
"retry_codes_name": "non_idempotent",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"Listen": {
|
||||
"timeout_millis": 86400000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"ListCollectionIds": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "deadline_exceeded_resource_exhausted_internal_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"BatchWrite": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "resource_exhausted_aborted_unavailable",
|
||||
"retry_params_name": "default"
|
||||
},
|
||||
"CreateDocument": {
|
||||
"timeout_millis": 60000,
|
||||
"retry_codes_name": "resource_exhausted_unavailable",
|
||||
"retry_params_name": "default"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
[
|
||||
"../../protos/google/firestore/v1/common.proto",
|
||||
"../../protos/google/firestore/v1/document.proto",
|
||||
"../../protos/google/firestore/v1/firestore.proto",
|
||||
"../../protos/google/firestore/v1/query.proto",
|
||||
"../../protos/google/firestore/v1/write.proto"
|
||||
]
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
{
|
||||
"schema": "1.0",
|
||||
"comment": "This file maps proto services/RPCs to the corresponding library clients/methods",
|
||||
"language": "typescript",
|
||||
"protoPackage": "google.firestore.v1",
|
||||
"libraryPackage": "@google-cloud/firestore",
|
||||
"services": {
|
||||
"Firestore": {
|
||||
"clients": {
|
||||
"grpc": {
|
||||
"libraryClient": "FirestoreClient",
|
||||
"rpcs": {
|
||||
"GetDocument": {
|
||||
"methods": [
|
||||
"getDocument"
|
||||
]
|
||||
},
|
||||
"UpdateDocument": {
|
||||
"methods": [
|
||||
"updateDocument"
|
||||
]
|
||||
},
|
||||
"DeleteDocument": {
|
||||
"methods": [
|
||||
"deleteDocument"
|
||||
]
|
||||
},
|
||||
"BeginTransaction": {
|
||||
"methods": [
|
||||
"beginTransaction"
|
||||
]
|
||||
},
|
||||
"Commit": {
|
||||
"methods": [
|
||||
"commit"
|
||||
]
|
||||
},
|
||||
"Rollback": {
|
||||
"methods": [
|
||||
"rollback"
|
||||
]
|
||||
},
|
||||
"BatchWrite": {
|
||||
"methods": [
|
||||
"batchWrite"
|
||||
]
|
||||
},
|
||||
"CreateDocument": {
|
||||
"methods": [
|
||||
"createDocument"
|
||||
]
|
||||
},
|
||||
"BatchGetDocuments": {
|
||||
"methods": [
|
||||
"batchGetDocuments"
|
||||
]
|
||||
},
|
||||
"RunQuery": {
|
||||
"methods": [
|
||||
"runQuery"
|
||||
]
|
||||
},
|
||||
"Write": {
|
||||
"methods": [
|
||||
"write"
|
||||
]
|
||||
},
|
||||
"Listen": {
|
||||
"methods": [
|
||||
"listen"
|
||||
]
|
||||
},
|
||||
"ListDocuments": {
|
||||
"methods": [
|
||||
"listDocuments",
|
||||
"listDocumentsStream",
|
||||
"listDocumentsAsync"
|
||||
]
|
||||
},
|
||||
"PartitionQuery": {
|
||||
"methods": [
|
||||
"partitionQuery",
|
||||
"partitionQueryStream",
|
||||
"partitionQueryAsync"
|
||||
]
|
||||
},
|
||||
"ListCollectionIds": {
|
||||
"methods": [
|
||||
"listCollectionIds",
|
||||
"listCollectionIdsStream",
|
||||
"listCollectionIdsAsync"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"grpc-fallback": {
|
||||
"libraryClient": "FirestoreClient",
|
||||
"rpcs": {
|
||||
"GetDocument": {
|
||||
"methods": [
|
||||
"getDocument"
|
||||
]
|
||||
},
|
||||
"UpdateDocument": {
|
||||
"methods": [
|
||||
"updateDocument"
|
||||
]
|
||||
},
|
||||
"DeleteDocument": {
|
||||
"methods": [
|
||||
"deleteDocument"
|
||||
]
|
||||
},
|
||||
"BeginTransaction": {
|
||||
"methods": [
|
||||
"beginTransaction"
|
||||
]
|
||||
},
|
||||
"Commit": {
|
||||
"methods": [
|
||||
"commit"
|
||||
]
|
||||
},
|
||||
"Rollback": {
|
||||
"methods": [
|
||||
"rollback"
|
||||
]
|
||||
},
|
||||
"BatchWrite": {
|
||||
"methods": [
|
||||
"batchWrite"
|
||||
]
|
||||
},
|
||||
"CreateDocument": {
|
||||
"methods": [
|
||||
"createDocument"
|
||||
]
|
||||
},
|
||||
"ListDocuments": {
|
||||
"methods": [
|
||||
"listDocuments",
|
||||
"listDocumentsStream",
|
||||
"listDocumentsAsync"
|
||||
]
|
||||
},
|
||||
"PartitionQuery": {
|
||||
"methods": [
|
||||
"partitionQuery",
|
||||
"partitionQueryStream",
|
||||
"partitionQueryAsync"
|
||||
]
|
||||
},
|
||||
"ListCollectionIds": {
|
||||
"methods": [
|
||||
"listCollectionIds",
|
||||
"listCollectionIdsStream",
|
||||
"listCollectionIdsAsync"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
import { FirestoreAdminClient } from './firestore_admin_client';
|
||||
import { FirestoreClient } from './firestore_client';
|
||||
export { FirestoreClient, FirestoreAdminClient };
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
"use strict";
|
||||
// Copyright 2019 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.
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const firestore_admin_client_1 = require("./firestore_admin_client");
|
||||
exports.FirestoreAdminClient = firestore_admin_client_1.FirestoreAdminClient;
|
||||
const firestore_client_1 = require("./firestore_client");
|
||||
exports.FirestoreClient = firestore_client_1.FirestoreClient;
|
||||
// Doing something really horrible for reverse compatibility with original JavaScript exports
|
||||
const existingExports = module.exports;
|
||||
module.exports = firestore_client_1.FirestoreClient;
|
||||
module.exports = Object.assign(module.exports, existingExports);
|
||||
//# sourceMappingURL=index.js.map
|
||||
+560
@@ -0,0 +1,560 @@
|
||||
/// <reference types="node" />
|
||||
import * as gax from 'google-gax';
|
||||
import { Callback, CallOptions, Descriptors, ClientOptions, PaginationCallback } from 'google-gax';
|
||||
import { Transform } from 'stream';
|
||||
import * as protos from '../../protos/firestore_v1beta1_proto_api';
|
||||
/**
|
||||
* The Cloud Firestore service.
|
||||
*
|
||||
* Cloud Firestore is a fast, fully managed, serverless, cloud-native NoSQL
|
||||
* document database that simplifies storing, syncing, and querying data for
|
||||
* your mobile, web, and IoT apps at global scale. Its client libraries provide
|
||||
* live synchronization and offline support, while its security features and
|
||||
* integrations with Firebase and Google Cloud Platform (GCP) accelerate
|
||||
* building truly serverless apps.
|
||||
* @class
|
||||
* @deprecated Use v1/firestore_client instead.
|
||||
* @memberof v1beta1
|
||||
*/
|
||||
export declare class FirestoreClient {
|
||||
private _terminated;
|
||||
private _opts;
|
||||
private _providedCustomServicePath;
|
||||
private _gaxModule;
|
||||
private _gaxGrpc;
|
||||
private _protos;
|
||||
private _defaults;
|
||||
auth: gax.GoogleAuth;
|
||||
descriptors: Descriptors;
|
||||
warn: (code: string, message: string, warnType?: string) => void;
|
||||
innerApiCalls: {
|
||||
[name: string]: Function;
|
||||
};
|
||||
firestoreStub?: Promise<{
|
||||
[name: string]: Function;
|
||||
}>;
|
||||
/**
|
||||
* Construct an instance of FirestoreClient.
|
||||
*
|
||||
* @param {object} [options] - The configuration object.
|
||||
* The options accepted by the constructor are described in detail
|
||||
* in [this document](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#creating-the-client-instance).
|
||||
* The common options are:
|
||||
* @param {object} [options.credentials] - Credentials object.
|
||||
* @param {string} [options.credentials.client_email]
|
||||
* @param {string} [options.credentials.private_key]
|
||||
* @param {string} [options.email] - Account email address. Required when
|
||||
* using a .pem or .p12 keyFilename.
|
||||
* @param {string} [options.keyFilename] - Full path to the a .json, .pem, or
|
||||
* .p12 key downloaded from the Google Developers Console. If you provide
|
||||
* a path to a JSON file, the projectId option below is not necessary.
|
||||
* NOTE: .pem and .p12 require you to specify options.email as well.
|
||||
* @param {number} [options.port] - The port on which to connect to
|
||||
* the remote host.
|
||||
* @param {string} [options.projectId] - The project ID from the Google
|
||||
* Developer's Console, e.g. 'grape-spaceship-123'. We will also check
|
||||
* the environment variable GCLOUD_PROJECT for your project ID. If your
|
||||
* app is running in an environment which supports
|
||||
* {@link https://developers.google.com/identity/protocols/application-default-credentials Application Default Credentials},
|
||||
* your project ID will be detected automatically.
|
||||
* @param {string} [options.apiEndpoint] - The domain name of the
|
||||
* API remote host.
|
||||
* @param {gax.ClientConfig} [options.clientConfig] - Client configuration override.
|
||||
* Follows the structure of {@link gapicConfig}.
|
||||
* @param {boolean} [options.fallback] - Use HTTP fallback mode.
|
||||
* In fallback mode, a special browser-compatible transport implementation is used
|
||||
* instead of gRPC transport. In browser context (if the `window` object is defined)
|
||||
* the fallback mode is enabled automatically; set `options.fallback` to `false`
|
||||
* if you need to override this behavior.
|
||||
*/
|
||||
constructor(opts?: ClientOptions);
|
||||
/**
|
||||
* Initialize the client.
|
||||
* Performs asynchronous operations (such as authentication) and prepares the client.
|
||||
* This function will be called automatically when any class method is called for the
|
||||
* first time, but if you need to initialize it before calling an actual method,
|
||||
* feel free to call initialize() directly.
|
||||
*
|
||||
* You can await on this method if you want to make sure the client is initialized.
|
||||
*
|
||||
* @returns {Promise} A promise that resolves to an authenticated service stub.
|
||||
*/
|
||||
initialize(): Promise<{
|
||||
[name: string]: Function;
|
||||
}>;
|
||||
/**
|
||||
* The DNS address for this API service.
|
||||
* @returns {string} The DNS address for this service.
|
||||
*/
|
||||
static get servicePath(): string;
|
||||
/**
|
||||
* The DNS address for this API service - same as servicePath(),
|
||||
* exists for compatibility reasons.
|
||||
* @returns {string} The DNS address for this service.
|
||||
*/
|
||||
static get apiEndpoint(): string;
|
||||
/**
|
||||
* The port for this API service.
|
||||
* @returns {number} The default port for this service.
|
||||
*/
|
||||
static get port(): number;
|
||||
/**
|
||||
* The scopes needed to make gRPC calls for every method defined
|
||||
* in this service.
|
||||
* @returns {string[]} List of default scopes.
|
||||
*/
|
||||
static get scopes(): string[];
|
||||
getProjectId(): Promise<string>;
|
||||
getProjectId(callback: Callback<string, undefined, undefined>): void;
|
||||
getDocument(request?: protos.google.firestore.v1beta1.IGetDocumentRequest, options?: CallOptions): Promise<[protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.IGetDocumentRequest | undefined, {} | undefined]>;
|
||||
getDocument(request: protos.google.firestore.v1beta1.IGetDocumentRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.IGetDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
getDocument(request: protos.google.firestore.v1beta1.IGetDocumentRequest, callback: Callback<protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.IGetDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
updateDocument(request?: protos.google.firestore.v1beta1.IUpdateDocumentRequest, options?: CallOptions): Promise<[protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.IUpdateDocumentRequest | undefined, {} | undefined]>;
|
||||
updateDocument(request: protos.google.firestore.v1beta1.IUpdateDocumentRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.IUpdateDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
updateDocument(request: protos.google.firestore.v1beta1.IUpdateDocumentRequest, callback: Callback<protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.IUpdateDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
deleteDocument(request?: protos.google.firestore.v1beta1.IDeleteDocumentRequest, options?: CallOptions): Promise<[protos.google.protobuf.IEmpty, protos.google.firestore.v1beta1.IDeleteDocumentRequest | undefined, {} | undefined]>;
|
||||
deleteDocument(request: protos.google.firestore.v1beta1.IDeleteDocumentRequest, options: CallOptions, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.v1beta1.IDeleteDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
deleteDocument(request: protos.google.firestore.v1beta1.IDeleteDocumentRequest, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.v1beta1.IDeleteDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
beginTransaction(request?: protos.google.firestore.v1beta1.IBeginTransactionRequest, options?: CallOptions): Promise<[protos.google.firestore.v1beta1.IBeginTransactionResponse, protos.google.firestore.v1beta1.IBeginTransactionRequest | undefined, {} | undefined]>;
|
||||
beginTransaction(request: protos.google.firestore.v1beta1.IBeginTransactionRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1beta1.IBeginTransactionResponse, protos.google.firestore.v1beta1.IBeginTransactionRequest | null | undefined, {} | null | undefined>): void;
|
||||
beginTransaction(request: protos.google.firestore.v1beta1.IBeginTransactionRequest, callback: Callback<protos.google.firestore.v1beta1.IBeginTransactionResponse, protos.google.firestore.v1beta1.IBeginTransactionRequest | null | undefined, {} | null | undefined>): void;
|
||||
commit(request?: protos.google.firestore.v1beta1.ICommitRequest, options?: CallOptions): Promise<[protos.google.firestore.v1beta1.ICommitResponse, protos.google.firestore.v1beta1.ICommitRequest | undefined, {} | undefined]>;
|
||||
commit(request: protos.google.firestore.v1beta1.ICommitRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1beta1.ICommitResponse, protos.google.firestore.v1beta1.ICommitRequest | null | undefined, {} | null | undefined>): void;
|
||||
commit(request: protos.google.firestore.v1beta1.ICommitRequest, callback: Callback<protos.google.firestore.v1beta1.ICommitResponse, protos.google.firestore.v1beta1.ICommitRequest | null | undefined, {} | null | undefined>): void;
|
||||
rollback(request?: protos.google.firestore.v1beta1.IRollbackRequest, options?: CallOptions): Promise<[protos.google.protobuf.IEmpty, protos.google.firestore.v1beta1.IRollbackRequest | undefined, {} | undefined]>;
|
||||
rollback(request: protos.google.firestore.v1beta1.IRollbackRequest, options: CallOptions, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.v1beta1.IRollbackRequest | null | undefined, {} | null | undefined>): void;
|
||||
rollback(request: protos.google.firestore.v1beta1.IRollbackRequest, callback: Callback<protos.google.protobuf.IEmpty, protos.google.firestore.v1beta1.IRollbackRequest | null | undefined, {} | null | undefined>): void;
|
||||
batchWrite(request?: protos.google.firestore.v1beta1.IBatchWriteRequest, options?: CallOptions): Promise<[protos.google.firestore.v1beta1.IBatchWriteResponse, protos.google.firestore.v1beta1.IBatchWriteRequest | undefined, {} | undefined]>;
|
||||
batchWrite(request: protos.google.firestore.v1beta1.IBatchWriteRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1beta1.IBatchWriteResponse, protos.google.firestore.v1beta1.IBatchWriteRequest | null | undefined, {} | null | undefined>): void;
|
||||
batchWrite(request: protos.google.firestore.v1beta1.IBatchWriteRequest, callback: Callback<protos.google.firestore.v1beta1.IBatchWriteResponse, protos.google.firestore.v1beta1.IBatchWriteRequest | null | undefined, {} | null | undefined>): void;
|
||||
createDocument(request?: protos.google.firestore.v1beta1.ICreateDocumentRequest, options?: CallOptions): Promise<[protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.ICreateDocumentRequest | undefined, {} | undefined]>;
|
||||
createDocument(request: protos.google.firestore.v1beta1.ICreateDocumentRequest, options: CallOptions, callback: Callback<protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.ICreateDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
createDocument(request: protos.google.firestore.v1beta1.ICreateDocumentRequest, callback: Callback<protos.google.firestore.v1beta1.IDocument, protos.google.firestore.v1beta1.ICreateDocumentRequest | null | undefined, {} | null | undefined>): void;
|
||||
/**
|
||||
* Gets multiple documents.
|
||||
*
|
||||
* Documents returned by this method are not guaranteed to be returned in the
|
||||
* same order that they were requested.
|
||||
*
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.database
|
||||
* Required. The database name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}`.
|
||||
* @param {string[]} request.documents
|
||||
* The names of the documents to retrieve. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* The request will fail if any of the document is not a child resource of the
|
||||
* given `database`. Duplicate names will be elided.
|
||||
* @param {google.firestore.v1beta1.DocumentMask} request.mask
|
||||
* The fields to return. If not set, returns all fields.
|
||||
*
|
||||
* If a document has a field that is not present in this mask, that field will
|
||||
* not be returned in the response.
|
||||
* @param {Buffer} request.transaction
|
||||
* Reads documents in a transaction.
|
||||
* @param {google.firestore.v1beta1.TransactionOptions} request.newTransaction
|
||||
* Starts a new transaction and reads the documents.
|
||||
* Defaults to a read-only transaction.
|
||||
* The new transaction ID will be returned as the first response in the
|
||||
* stream.
|
||||
* @param {google.protobuf.Timestamp} request.readTime
|
||||
* Reads documents as they were at the given time.
|
||||
* This may not be older than 270 seconds.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits [BatchGetDocumentsResponse]{@link google.firestore.v1beta1.BatchGetDocumentsResponse} on 'data' event.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#server-streaming)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const stream = client.batchGetDocuments(request);
|
||||
* stream.on('data', (response) => { ... });
|
||||
* stream.on('end', () => { ... });
|
||||
*/
|
||||
batchGetDocuments(request?: protos.google.firestore.v1beta1.IBatchGetDocumentsRequest, options?: CallOptions): gax.CancellableStream;
|
||||
/**
|
||||
* Runs a query.
|
||||
*
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents` or
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents` or
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {google.firestore.v1beta1.StructuredQuery} request.structuredQuery
|
||||
* A structured query.
|
||||
* @param {Buffer} request.transaction
|
||||
* Reads documents in a transaction.
|
||||
* @param {google.firestore.v1beta1.TransactionOptions} request.newTransaction
|
||||
* Starts a new transaction and reads the documents.
|
||||
* Defaults to a read-only transaction.
|
||||
* The new transaction ID will be returned as the first response in the
|
||||
* stream.
|
||||
* @param {google.protobuf.Timestamp} request.readTime
|
||||
* Reads documents as they were at the given time.
|
||||
* This may not be older than 270 seconds.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits [RunQueryResponse]{@link google.firestore.v1beta1.RunQueryResponse} on 'data' event.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#server-streaming)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const stream = client.runQuery(request);
|
||||
* stream.on('data', (response) => { ... });
|
||||
* stream.on('end', () => { ... });
|
||||
*/
|
||||
runQuery(request?: protos.google.firestore.v1beta1.IRunQueryRequest, options?: CallOptions): gax.CancellableStream;
|
||||
/**
|
||||
* Streams batches of document updates and deletes, in order.
|
||||
*
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which is both readable and writable. It accepts objects
|
||||
* representing [WriteRequest]{@link google.firestore.v1beta1.WriteRequest} for write() method, and
|
||||
* will emit objects representing [WriteResponse]{@link google.firestore.v1beta1.WriteResponse} on 'data' event asynchronously.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#bi-directional-streaming)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const stream = client.write();
|
||||
* stream.on('data', (response) => { ... });
|
||||
* stream.on('end', () => { ... });
|
||||
* stream.write(request);
|
||||
* stream.end();
|
||||
*/
|
||||
write(options?: CallOptions): gax.CancellableStream;
|
||||
/**
|
||||
* Listens to changes.
|
||||
*
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which is both readable and writable. It accepts objects
|
||||
* representing [ListenRequest]{@link google.firestore.v1beta1.ListenRequest} for write() method, and
|
||||
* will emit objects representing [ListenResponse]{@link google.firestore.v1beta1.ListenResponse} on 'data' event asynchronously.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#bi-directional-streaming)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const stream = client.listen();
|
||||
* stream.on('data', (response) => { ... });
|
||||
* stream.on('end', () => { ... });
|
||||
* stream.write(request);
|
||||
* stream.end();
|
||||
*/
|
||||
listen(options?: CallOptions): gax.CancellableStream;
|
||||
listDocuments(request?: protos.google.firestore.v1beta1.IListDocumentsRequest, options?: CallOptions): Promise<[protos.google.firestore.v1beta1.IDocument[], protos.google.firestore.v1beta1.IListDocumentsRequest | null, protos.google.firestore.v1beta1.IListDocumentsResponse]>;
|
||||
listDocuments(request: protos.google.firestore.v1beta1.IListDocumentsRequest, options: CallOptions, callback: PaginationCallback<protos.google.firestore.v1beta1.IListDocumentsRequest, protos.google.firestore.v1beta1.IListDocumentsResponse | null | undefined, protos.google.firestore.v1beta1.IDocument>): void;
|
||||
listDocuments(request: protos.google.firestore.v1beta1.IListDocumentsRequest, callback: PaginationCallback<protos.google.firestore.v1beta1.IListDocumentsRequest, protos.google.firestore.v1beta1.IListDocumentsResponse | null | undefined, protos.google.firestore.v1beta1.IDocument>): void;
|
||||
/**
|
||||
* Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents` or
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents` or
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {string} request.collectionId
|
||||
* Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`
|
||||
* or `messages`.
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of documents to return.
|
||||
* @param {string} request.pageToken
|
||||
* The `next_page_token` value returned from a previous List request, if any.
|
||||
* @param {string} request.orderBy
|
||||
* The order to sort results by. For example: `priority desc, name`.
|
||||
* @param {google.firestore.v1beta1.DocumentMask} request.mask
|
||||
* The fields to return. If not set, returns all fields.
|
||||
*
|
||||
* If a document has a field that is not present in this mask, that field
|
||||
* will not be returned in the response.
|
||||
* @param {Buffer} request.transaction
|
||||
* Reads documents in a transaction.
|
||||
* @param {google.protobuf.Timestamp} request.readTime
|
||||
* Reads documents as they were at the given time.
|
||||
* This may not be older than 270 seconds.
|
||||
* @param {boolean} request.showMissing
|
||||
* If the list should show missing documents. A missing document is a
|
||||
* document that does not exist but has sub-documents. These documents will
|
||||
* be returned with a key but will not have fields, {@link google.firestore.v1beta1.Document.create_time|Document.create_time},
|
||||
* or {@link google.firestore.v1beta1.Document.update_time|Document.update_time} set.
|
||||
*
|
||||
* Requests with `show_missing` may not specify `where` or
|
||||
* `order_by`.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits an object representing [Document]{@link google.firestore.v1beta1.Document} on 'data' event.
|
||||
* The client library will perform auto-pagination by default: it will call the API as many
|
||||
* times as needed. Note that it can affect your quota.
|
||||
* We recommend using `listDocumentsAsync()`
|
||||
* method described below for async iteration which you can stop as needed.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
*/
|
||||
listDocumentsStream(request?: protos.google.firestore.v1beta1.IListDocumentsRequest, options?: CallOptions): Transform;
|
||||
/**
|
||||
* Equivalent to `listDocuments`, but returns an iterable object.
|
||||
*
|
||||
* `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents` or
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents` or
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {string} request.collectionId
|
||||
* Required. The collection ID, relative to `parent`, to list. For example: `chatrooms`
|
||||
* or `messages`.
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of documents to return.
|
||||
* @param {string} request.pageToken
|
||||
* The `next_page_token` value returned from a previous List request, if any.
|
||||
* @param {string} request.orderBy
|
||||
* The order to sort results by. For example: `priority desc, name`.
|
||||
* @param {google.firestore.v1beta1.DocumentMask} request.mask
|
||||
* The fields to return. If not set, returns all fields.
|
||||
*
|
||||
* If a document has a field that is not present in this mask, that field
|
||||
* will not be returned in the response.
|
||||
* @param {Buffer} request.transaction
|
||||
* Reads documents in a transaction.
|
||||
* @param {google.protobuf.Timestamp} request.readTime
|
||||
* Reads documents as they were at the given time.
|
||||
* This may not be older than 270 seconds.
|
||||
* @param {boolean} request.showMissing
|
||||
* If the list should show missing documents. A missing document is a
|
||||
* document that does not exist but has sub-documents. These documents will
|
||||
* be returned with a key but will not have fields, {@link google.firestore.v1beta1.Document.create_time|Document.create_time},
|
||||
* or {@link google.firestore.v1beta1.Document.update_time|Document.update_time} set.
|
||||
*
|
||||
* Requests with `show_missing` may not specify `where` or
|
||||
* `order_by`.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Object}
|
||||
* An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
|
||||
* When you iterate the returned iterable, each element will be an object representing
|
||||
* [Document]{@link google.firestore.v1beta1.Document}. The API will be called under the hood as needed, once per the page,
|
||||
* so you can stop the iteration when you don't need more results.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const iterable = client.listDocumentsAsync(request);
|
||||
* for await (const response of iterable) {
|
||||
* // process response
|
||||
* }
|
||||
*/
|
||||
listDocumentsAsync(request?: protos.google.firestore.v1beta1.IListDocumentsRequest, options?: CallOptions): AsyncIterable<protos.google.firestore.v1beta1.IDocument>;
|
||||
partitionQuery(request?: protos.google.firestore.v1beta1.IPartitionQueryRequest, options?: CallOptions): Promise<[protos.google.firestore.v1beta1.ICursor[], protos.google.firestore.v1beta1.IPartitionQueryRequest | null, protos.google.firestore.v1beta1.IPartitionQueryResponse]>;
|
||||
partitionQuery(request: protos.google.firestore.v1beta1.IPartitionQueryRequest, options: CallOptions, callback: PaginationCallback<protos.google.firestore.v1beta1.IPartitionQueryRequest, protos.google.firestore.v1beta1.IPartitionQueryResponse | null | undefined, protos.google.firestore.v1beta1.ICursor>): void;
|
||||
partitionQuery(request: protos.google.firestore.v1beta1.IPartitionQueryRequest, callback: PaginationCallback<protos.google.firestore.v1beta1.IPartitionQueryRequest, protos.google.firestore.v1beta1.IPartitionQueryResponse | null | undefined, protos.google.firestore.v1beta1.ICursor>): void;
|
||||
/**
|
||||
* Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents`.
|
||||
* Document resource names are not supported; only database resource names
|
||||
* can be specified.
|
||||
* @param {google.firestore.v1beta1.StructuredQuery} request.structuredQuery
|
||||
* A structured query.
|
||||
* Query must specify collection with all descendants and be ordered by name
|
||||
* ascending. Other filters, order bys, limits, offsets, and start/end
|
||||
* cursors are not supported.
|
||||
* @param {number} request.partitionCount
|
||||
* The desired maximum number of partition points.
|
||||
* The partitions may be returned across multiple pages of results.
|
||||
* The number must be positive. The actual number of partitions
|
||||
* returned may be fewer.
|
||||
*
|
||||
* For example, this may be set to one fewer than the number of parallel
|
||||
* queries to be run, or in running a data pipeline job, one fewer than the
|
||||
* number of workers or compute instances available.
|
||||
* @param {string} request.pageToken
|
||||
* The `next_page_token` value returned from a previous call to
|
||||
* PartitionQuery that may be used to get an additional set of results.
|
||||
* There are no ordering guarantees between sets of results. Thus, using
|
||||
* multiple sets of results will require merging the different result sets.
|
||||
*
|
||||
* For example, two subsequent calls using a page_token may return:
|
||||
*
|
||||
* * cursor B, cursor M, cursor Q
|
||||
* * cursor A, cursor U, cursor W
|
||||
*
|
||||
* To obtain a complete result set ordered with respect to the results of the
|
||||
* query supplied to PartitionQuery, the results sets should be merged:
|
||||
* cursor A, cursor B, cursor M, cursor Q, cursor U, cursor W
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of partitions to return in this call, subject to
|
||||
* `partition_count`.
|
||||
*
|
||||
* For example, if `partition_count` = 10 and `page_size` = 8, the first call
|
||||
* to PartitionQuery will return up to 8 partitions and a `next_page_token`
|
||||
* if more results exist. A second call to PartitionQuery will return up to
|
||||
* 2 partitions, to complete the total of 10 specified in `partition_count`.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits an object representing [Cursor]{@link google.firestore.v1beta1.Cursor} on 'data' event.
|
||||
* The client library will perform auto-pagination by default: it will call the API as many
|
||||
* times as needed. Note that it can affect your quota.
|
||||
* We recommend using `partitionQueryAsync()`
|
||||
* method described below for async iteration which you can stop as needed.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
*/
|
||||
partitionQueryStream(request?: protos.google.firestore.v1beta1.IPartitionQueryRequest, options?: CallOptions): Transform;
|
||||
/**
|
||||
* Equivalent to `partitionQuery`, but returns an iterable object.
|
||||
*
|
||||
* `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent resource name. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents`.
|
||||
* Document resource names are not supported; only database resource names
|
||||
* can be specified.
|
||||
* @param {google.firestore.v1beta1.StructuredQuery} request.structuredQuery
|
||||
* A structured query.
|
||||
* Query must specify collection with all descendants and be ordered by name
|
||||
* ascending. Other filters, order bys, limits, offsets, and start/end
|
||||
* cursors are not supported.
|
||||
* @param {number} request.partitionCount
|
||||
* The desired maximum number of partition points.
|
||||
* The partitions may be returned across multiple pages of results.
|
||||
* The number must be positive. The actual number of partitions
|
||||
* returned may be fewer.
|
||||
*
|
||||
* For example, this may be set to one fewer than the number of parallel
|
||||
* queries to be run, or in running a data pipeline job, one fewer than the
|
||||
* number of workers or compute instances available.
|
||||
* @param {string} request.pageToken
|
||||
* The `next_page_token` value returned from a previous call to
|
||||
* PartitionQuery that may be used to get an additional set of results.
|
||||
* There are no ordering guarantees between sets of results. Thus, using
|
||||
* multiple sets of results will require merging the different result sets.
|
||||
*
|
||||
* For example, two subsequent calls using a page_token may return:
|
||||
*
|
||||
* * cursor B, cursor M, cursor Q
|
||||
* * cursor A, cursor U, cursor W
|
||||
*
|
||||
* To obtain a complete result set ordered with respect to the results of the
|
||||
* query supplied to PartitionQuery, the results sets should be merged:
|
||||
* cursor A, cursor B, cursor M, cursor Q, cursor U, cursor W
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of partitions to return in this call, subject to
|
||||
* `partition_count`.
|
||||
*
|
||||
* For example, if `partition_count` = 10 and `page_size` = 8, the first call
|
||||
* to PartitionQuery will return up to 8 partitions and a `next_page_token`
|
||||
* if more results exist. A second call to PartitionQuery will return up to
|
||||
* 2 partitions, to complete the total of 10 specified in `partition_count`.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Object}
|
||||
* An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
|
||||
* When you iterate the returned iterable, each element will be an object representing
|
||||
* [Cursor]{@link google.firestore.v1beta1.Cursor}. The API will be called under the hood as needed, once per the page,
|
||||
* so you can stop the iteration when you don't need more results.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const iterable = client.partitionQueryAsync(request);
|
||||
* for await (const response of iterable) {
|
||||
* // process response
|
||||
* }
|
||||
*/
|
||||
partitionQueryAsync(request?: protos.google.firestore.v1beta1.IPartitionQueryRequest, options?: CallOptions): AsyncIterable<protos.google.firestore.v1beta1.ICursor>;
|
||||
listCollectionIds(request?: protos.google.firestore.v1beta1.IListCollectionIdsRequest, options?: CallOptions): Promise<[string[], protos.google.firestore.v1beta1.IListCollectionIdsRequest | null, protos.google.firestore.v1beta1.IListCollectionIdsResponse]>;
|
||||
listCollectionIds(request: protos.google.firestore.v1beta1.IListCollectionIdsRequest, options: CallOptions, callback: PaginationCallback<protos.google.firestore.v1beta1.IListCollectionIdsRequest, protos.google.firestore.v1beta1.IListCollectionIdsResponse | null | undefined, string>): void;
|
||||
listCollectionIds(request: protos.google.firestore.v1beta1.IListCollectionIdsRequest, callback: PaginationCallback<protos.google.firestore.v1beta1.IListCollectionIdsRequest, protos.google.firestore.v1beta1.IListCollectionIdsResponse | null | undefined, string>): void;
|
||||
/**
|
||||
* Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent document. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of results to return.
|
||||
* @param {string} request.pageToken
|
||||
* A page token. Must be a value from
|
||||
* {@link google.firestore.v1beta1.ListCollectionIdsResponse|ListCollectionIdsResponse}.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Stream}
|
||||
* An object stream which emits an object representing string on 'data' event.
|
||||
* The client library will perform auto-pagination by default: it will call the API as many
|
||||
* times as needed. Note that it can affect your quota.
|
||||
* We recommend using `listCollectionIdsAsync()`
|
||||
* method described below for async iteration which you can stop as needed.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
*/
|
||||
listCollectionIdsStream(request?: protos.google.firestore.v1beta1.IListCollectionIdsRequest, options?: CallOptions): Transform;
|
||||
/**
|
||||
* Equivalent to `listCollectionIds`, but returns an iterable object.
|
||||
*
|
||||
* `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
|
||||
* @param {Object} request
|
||||
* The request object that will be sent.
|
||||
* @param {string} request.parent
|
||||
* Required. The parent document. In the format:
|
||||
* `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
|
||||
* For example:
|
||||
* `projects/my-project/databases/my-database/documents/chatrooms/my-chatroom`
|
||||
* @param {number} request.pageSize
|
||||
* The maximum number of results to return.
|
||||
* @param {string} request.pageToken
|
||||
* A page token. Must be a value from
|
||||
* {@link google.firestore.v1beta1.ListCollectionIdsResponse|ListCollectionIdsResponse}.
|
||||
* @param {object} [options]
|
||||
* Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
|
||||
* @returns {Object}
|
||||
* An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
|
||||
* When you iterate the returned iterable, each element will be an object representing
|
||||
* string. The API will be called under the hood as needed, once per the page,
|
||||
* so you can stop the iteration when you don't need more results.
|
||||
* Please see the
|
||||
* [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
|
||||
* for more details and examples.
|
||||
* @example
|
||||
* const iterable = client.listCollectionIdsAsync(request);
|
||||
* for await (const response of iterable) {
|
||||
* // process response
|
||||
* }
|
||||
*/
|
||||
listCollectionIdsAsync(request?: protos.google.firestore.v1beta1.IListCollectionIdsRequest, options?: CallOptions): AsyncIterable<string>;
|
||||
/**
|
||||
* Terminate the gRPC channel and close the client.
|
||||
*
|
||||
* The client will no longer be usable and all future behavior is undefined.
|
||||
* @returns {Promise} A promise that resolves when the client is closed.
|
||||
*/
|
||||
close(): Promise<void>;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user