Skip to content

Commit a514bd9

Browse files
authored
gRPC: replace Objective-C implementation with the new C++ implementation (#1968)
* add support for SSL disabled to `GrpcConnection` (unfortunately, there currently is no way to verify this change actually works); * make gRPC calls using the C++ implementation: * make `FSTRemoteStore` create C++ streams instead of their Objective-C counterparts; * port firebase/firebase-js-sdk#1041: streams are now never recreated, only restarted; * make `FSTDatastore` delegate server calls to the C++ implementation; * port `MockWatchStream` and `MockWriteStream` to C++ (`FSTMockDatastore` is still in place, because `Datastore` is not fully ported yet); * no longer generate Objective-C gRPC service definitions from protos; * remove all references to Objective-C gRPC client; * check in gRPC root certificates file and load it at runtime (the check-in part is temporary until gRPC-C++.podspec provides the certificate). This makes SSL work.
1 parent b869115 commit a514bd9

39 files changed

+4947
-3166
lines changed

FirebaseFirestore.podspec

+4-1
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,12 @@ Google Cloud Firestore is a NoSQL document database built for automatic scaling,
4949
]
5050
s.public_header_files='Firestore/Source/Public/*.h'
5151

52+
# TODO(varconst): remove once https://github.com/grpc/grpc/pull/16962 makes it
53+
# into a release.
54+
s.resource_bundles={'gRPCCertificates'=>['Firestore/etc/roots.pem']}
55+
5256
s.dependency'FirebaseAuthInterop','~> 1.0'
5357
s.dependency'FirebaseCore','~> 5.1'
54-
s.dependency'gRPC-ProtoRPC','~> 1.0'
5558
s.dependency'gRPC-C++','~> 0.0.3'
5659
s.dependency'leveldb-library','~> 1.20'
5760
s.dependency'Protobuf','~> 3.1'

Firestore/Example/Firestore.xcodeproj/project.pbxproj

+38-48
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@
8282
5492E07A202154D600B64F25 /* FIRTypeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E071202154D600B64F25 /* FIRTypeTests.mm */; };
8383
5492E07F202154EC00B64F25 /* FSTTransactionTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */; };
8484
5492E080202154EC00B64F25 /* FSTSmokeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */; };
85-
5492E081202154EC00B64F25 /* FSTStreamTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07D202154EB00B64F25 /* FSTStreamTests.mm */; };
8685
5492E082202154EC00B64F25 /* FSTDatastoreTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */; };
8786
5492E09D2021552D00B64F25 /* FSTLocalStoreTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0832021552A00B64F25 /* FSTLocalStoreTests.mm */; };
8887
5492E09F2021552D00B64F25 /* FSTLevelDBMigrationsTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0862021552A00B64F25 /* FSTLevelDBMigrationsTests.mm */; };
@@ -361,7 +360,6 @@
361360
5492E071202154D600B64F25 /* FIRTypeTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FIRTypeTests.mm; sourceTree = "<group>"; };
362361
5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTTransactionTests.mm; sourceTree = "<group>"; };
363362
5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTSmokeTests.mm; sourceTree = "<group>"; };
364-
5492E07D202154EB00B64F25 /* FSTStreamTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTStreamTests.mm; sourceTree = "<group>"; };
365363
5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDatastoreTests.mm; sourceTree = "<group>"; };
366364
5492E0832021552A00B64F25 /* FSTLocalStoreTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTLocalStoreTests.mm; sourceTree = "<group>"; };
367365
5492E0852021552A00B64F25 /* FSTRemoteDocumentCacheTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSTRemoteDocumentCacheTests.h; sourceTree = "<group>"; };
@@ -1234,7 +1232,6 @@
12341232
DE03B3621F215E1600A30B9C /* CAcert.pem */,
12351233
5492E07E202154EC00B64F25 /* FSTDatastoreTests.mm */,
12361234
5492E07C202154EB00B64F25 /* FSTSmokeTests.mm */,
1237-
5492E07D202154EB00B64F25 /* FSTStreamTests.mm */,
12381235
5492E07B202154EB00B64F25 /* FSTTransactionTests.mm */,
12391236
);
12401237
path = Integration;
@@ -1270,6 +1267,7 @@
12701267
54C9EDEE2040E16300A969CD /* Frameworks */,
12711268
54C9EDEF2040E16300A969CD /* Resources */,
12721269
EA424838F4A5DD7B337F57AB /* [CP] Embed Pods Frameworks */,
1270+
DE5C36328822481F6EB6EF16 /* [CP] Copy Pods Resources */,
12731271
);
12741272
buildRules = (
12751273
);
@@ -1310,6 +1308,7 @@
13101308
6003F587195388D20070C39A /* Frameworks */,
13111309
6003F588195388D20070C39A /* Resources */,
13121310
1EE692C7509A98D7EB03CA51 /* [CP] Embed Pods Frameworks */,
1311+
1E7DAED3207D01F1744EA227 /* [CP] Copy Pods Resources */,
13131312
);
13141313
buildRules = (
13151314
);
@@ -1510,6 +1509,24 @@
15101509
/* End PBXResourcesBuildPhase section */
15111510

15121511
/* Begin PBXShellScriptBuildPhase section */
1512+
1E7DAED3207D01F1744EA227 /* [CP] Copy Pods Resources */ = {
1513+
isa = PBXShellScriptBuildPhase;
1514+
buildActionMask = 2147483647;
1515+
files = (
1516+
);
1517+
inputPaths = (
1518+
"${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS/Pods-Firestore_Example_iOS-resources.sh",
1519+
"${PODS_CONFIGURATION_BUILD_DIR}/FirebaseFirestore/gRPCCertificates.bundle",
1520+
);
1521+
name = "[CP] Copy Pods Resources";
1522+
outputPaths = (
1523+
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle",
1524+
);
1525+
runOnlyForDeploymentPostprocessing = 0;
1526+
shellPath = /bin/sh;
1527+
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS/Pods-Firestore_Example_iOS-resources.sh\"\n";
1528+
showEnvVarsInLog = 0;
1529+
};
15131530
1EE692C7509A98D7EB03CA51 /* [CP] Embed Pods Frameworks */ = {
15141531
isa = PBXShellScriptBuildPhase;
15151532
buildActionMask = 2147483647;
@@ -1521,11 +1538,8 @@
15211538
"${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework",
15221539
"${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework",
15231540
"${BUILT_PRODUCTS_DIR}/Protobuf-iOS8.0/Protobuf.framework",
1524-
"${BUILT_PRODUCTS_DIR}/gRPC/GRPCClient.framework",
15251541
"${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework",
15261542
"${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework",
1527-
"${BUILT_PRODUCTS_DIR}/gRPC-ProtoRPC/ProtoRPC.framework",
1528-
"${BUILT_PRODUCTS_DIR}/gRPC-RxLibrary/RxLibrary.framework",
15291543
"${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework",
15301544
"${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework",
15311545
);
@@ -1535,11 +1549,8 @@
15351549
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework",
15361550
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework",
15371551
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework",
1538-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRPCClient.framework",
15391552
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework",
15401553
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework",
1541-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtoRPC.framework",
1542-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxLibrary.framework",
15431554
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework",
15441555
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework",
15451556
);
@@ -1757,6 +1768,24 @@
17571768
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
17581769
showEnvVarsInLog = 0;
17591770
};
1771+
DE5C36328822481F6EB6EF16 /* [CP] Copy Pods Resources */ = {
1772+
isa = PBXShellScriptBuildPhase;
1773+
buildActionMask = 2147483647;
1774+
files = (
1775+
);
1776+
inputPaths = (
1777+
"${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS-resources.sh",
1778+
"${PODS_CONFIGURATION_BUILD_DIR}/FirebaseFirestore/gRPCCertificates.bundle",
1779+
);
1780+
name = "[CP] Copy Pods Resources";
1781+
outputPaths = (
1782+
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle",
1783+
);
1784+
runOnlyForDeploymentPostprocessing = 0;
1785+
shellPath = /bin/sh;
1786+
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS-resources.sh\"\n";
1787+
showEnvVarsInLog = 0;
1788+
};
17601789
EA424838F4A5DD7B337F57AB /* [CP] Embed Pods Frameworks */ = {
17611790
isa = PBXShellScriptBuildPhase;
17621791
buildActionMask = 2147483647;
@@ -1768,11 +1797,8 @@
17681797
"${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework",
17691798
"${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework",
17701799
"${BUILT_PRODUCTS_DIR}/Protobuf-iOS8.0/Protobuf.framework",
1771-
"${BUILT_PRODUCTS_DIR}/gRPC/GRPCClient.framework",
17721800
"${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework",
17731801
"${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework",
1774-
"${BUILT_PRODUCTS_DIR}/gRPC-ProtoRPC/ProtoRPC.framework",
1775-
"${BUILT_PRODUCTS_DIR}/gRPC-RxLibrary/RxLibrary.framework",
17761802
"${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework",
17771803
"${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework",
17781804
);
@@ -1782,11 +1808,8 @@
17821808
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework",
17831809
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework",
17841810
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework",
1785-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRPCClient.framework",
17861811
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework",
17871812
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework",
1788-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtoRPC.framework",
1789-
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxLibrary.framework",
17901813
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework",
17911814
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework",
17921815
);
@@ -2006,7 +2029,6 @@
20062029
5492E0422021440500B64F25 /* FSTHelpers.mm in Sources */,
20072030
5491BC731FB44593008B3588 /* FSTIntegrationTestCase.mm in Sources */,
20082031
5492E080202154EC00B64F25 /* FSTSmokeTests.mm in Sources */,
2009-
5492E081202154EC00B64F25 /* FSTStreamTests.mm in Sources */,
20102032
5492E07F202154EC00B64F25 /* FSTTransactionTests.mm in Sources */,
20112033
5492E0442021457E00B64F25 /* XCTestCase+Await.mm in Sources */,
20122034
B67BF44A216EB43000CA9097 /* create_noop_connectivity_monitor.cc in Sources */,
@@ -2219,14 +2241,6 @@
22192241
"-iquote",
22202242
"\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"",
22212243
"-iquote",
2222-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"",
2223-
"-iquote",
2224-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"",
2225-
"-iquote",
2226-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"",
2227-
"-iquote",
2228-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"",
2229-
"-iquote",
22302244
"\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"",
22312245
"-iquote",
22322246
"\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"",
@@ -2303,14 +2317,6 @@
23032317
"-iquote",
23042318
"\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"",
23052319
"-iquote",
2306-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"",
2307-
"-iquote",
2308-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"",
2309-
"-iquote",
2310-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"",
2311-
"-iquote",
2312-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"",
2313-
"-iquote",
23142320
"\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"",
23152321
"-iquote",
23162322
"\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"",
@@ -2512,14 +2518,6 @@
25122518
"-iquote",
25132519
"\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"",
25142520
"-iquote",
2515-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"",
2516-
"-iquote",
2517-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"",
2518-
"-iquote",
2519-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"",
2520-
"-iquote",
2521-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"",
2522-
"-iquote",
25232521
"\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"",
25242522
"-iquote",
25252523
"\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"",
@@ -2597,14 +2595,6 @@
25972595
"-iquote",
25982596
"\"${PODS_CONFIGURATION_BUILD_DIR}/Protobuf/Protobuf.framework/Headers\"",
25992597
"-iquote",
2600-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-Core/grpc.framework/Headers\"",
2601-
"-iquote",
2602-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-ProtoRPC/ProtoRPC.framework/Headers\"",
2603-
"-iquote",
2604-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC-RxLibrary/RxLibrary.framework/Headers\"",
2605-
"-iquote",
2606-
"\"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/GRPCClient.framework/Headers\"",
2607-
"-iquote",
26082598
"\"${PODS_CONFIGURATION_BUILD_DIR}/leveldb-library/leveldb.framework/Headers\"",
26092599
"-iquote",
26102600
"\"${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb.framework/Headers\"",

Firestore/Example/Tests/Integration/FSTDatastoreTests.mm

+5-3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
#import<FirebaseFirestore/FirebaseFirestore.h>
1818

1919
#import<FirebaseFirestore/FIRTimestamp.h>
20-
#import<GRPCClient/GRPCCall+ChannelCredentials.h>
21-
#import<GRPCClient/GRPCCall+Tests.h>
2220
#import<XCTest/XCTest.h>
2321

2422
#import"Firestore/Source/API/FIRDocumentReference+Internal.h"
@@ -52,6 +50,7 @@
5250
using firebase::firestore::model::DocumentKeySet;
5351
using firebase::firestore::model::Precondition;
5452
using firebase::firestore::model::TargetId;
53+
using firebase::firestore::remote::GrpcConnection;
5554

5655
NS_ASSUME_NONNULL_BEGIN
5756

@@ -162,7 +161,7 @@ - (void)setUp {
162161
NSString *projectID = [FSTIntegrationTestCase projectID];
163162
FIRFirestoreSettings *settings = [FSTIntegrationTestCase settings];
164163
if (!settings.sslEnabled) {
165-
[GRPCCall useInsecureConnectionsForHost:settings.host];
164+
GrpcConnection::UseInsecureChannel(util::MakeString(settings.host));
166165
}
167166

168167
DatabaseId database_id(util::MakeString(projectID), DatabaseId::kDefault);
@@ -222,6 +221,9 @@ - (void)testStreamingWrite {
222221
mutations:@[ mutation ]];
223222
[_testWorkerQueue dispatchAsync:^{
224223
[_remoteStore addBatchToWritePipeline:batch];
224+
// The added batch won't be written immediately because write stream wasn't yet open --
225+
// trigger its opening.
226+
[_remoteStore fillWritePipeline];
225227
}];
226228

227229
[selfawaitExpectations];

0 commit comments

Comments
 (0)
close