Skip to content

Commit

Permalink
feat(fdc): Add GMP header (#13358)
Browse files Browse the repository at this point in the history
  • Loading branch information
maneesht authored Sep 25, 2024
1 parent 77ded00 commit 3a2ad61
Show file tree
Hide file tree
Showing 10 changed files with 63 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,4 @@
<data android:mimeType="text/plain" />
</intent>
</queries>
</manifest>
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
"port": 9099
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class TransportOptions {
/// Interface for transports connecting to the DataConnect backend.
abstract class DataConnectTransport {
/// Constructor.
DataConnectTransport(this.transportOptions, this.options);
DataConnectTransport(this.transportOptions, this.options, this.appId);

/// Transport options.
TransportOptions transportOptions;
Expand All @@ -44,17 +44,20 @@ abstract class DataConnectTransport {
/// FirebaseAppCheck to use to get app check token.
FirebaseAppCheck? appCheck;

/// Application ID
String appId;

/// Invokes corresponding query endpoint.
Future<Data> invokeQuery<Data, Variables>(
String queryName,
Deserializer<Data> deserializer,
Serializer<Variables>? serializer,
Serializer<Variables> serializer,
Variables? vars);

/// Invokes corresponding mutation endpoint.
Future<Data> invokeMutation<Data, Variables>(
String queryName,
Deserializer<Data> deserializer,
Serializer<Variables>? serializer,
Serializer<Variables> serializer,
Variables? vars);
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ class FirebaseDataConnect extends FirebasePluginPlatform {
void checkTransport() {
transportOptions ??=
TransportOptions('firebasedataconnect.googleapis.com', null, true);
transport = getTransport(transportOptions!, options, auth, appCheck);
transport = getTransport(
transportOptions!, options, app.options.appId, auth, appCheck);
}

/// Returns a [QueryRef] object.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@ part of firebase_data_connect_grpc;
/// Transport used for Android/iOS. Uses a GRPC transport instead of REST.
class GRPCTransport implements DataConnectTransport {
/// GRPCTransport creates a new channel
GRPCTransport(this.transportOptions, this.options, this.auth, this.appCheck) {
GRPCTransport(
this.transportOptions,
this.options,
this.appId,
this.auth,
this.appCheck,
) {
bool isSecure =
transportOptions.isSecure == null || transportOptions.isSecure == true;
channel = ClientChannel(transportOptions.host,
Expand Down Expand Up @@ -46,6 +52,10 @@ class GRPCTransport implements DataConnectTransport {
@override
DataConnectOptions options;

/// Application ID
@override
String appId;

Future<Map<String, String>> getMetadata() async {
String? authToken;
try {
Expand All @@ -70,6 +80,7 @@ class GRPCTransport implements DataConnectTransport {
if (appCheckToken != null) {
metadata['X-Firebase-AppCheck'] = appCheckToken;
}
metadata['x-firebase-gmpid'] = appId;
return metadata;
}

Expand Down Expand Up @@ -134,6 +145,7 @@ class GRPCTransport implements DataConnectTransport {
DataConnectTransport getTransport(
TransportOptions transportOptions,
DataConnectOptions options,
String appId,
FirebaseAuth? auth,
FirebaseAppCheck? appCheck) =>
GRPCTransport(transportOptions, options, auth, appCheck);
GRPCTransport(transportOptions, options, appId, auth, appCheck);
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ part of firebase_data_connect_rest;
/// RestTransport makes requests out to the REST endpoints of the configured backend.
class RestTransport implements DataConnectTransport {
/// Initializes necessary protocol and port.
RestTransport(this.transportOptions, this.options, this.auth, this.appCheck) {
RestTransport(this.transportOptions, this.options, this.appId, this.auth,
this.appCheck) {
String protocol = 'http';
if (transportOptions.isSecure == null ||
transportOptions.isSecure == true) {
Expand Down Expand Up @@ -48,6 +49,10 @@ class RestTransport implements DataConnectTransport {
@override
DataConnectOptions options;

/// Firebase application ID.
@override
String appId;

/// Invokes the current operation, whether its a query or mutation.
Future<Data> invokeOperation<Data, Variables>(
String queryName,
Expand Down Expand Up @@ -82,6 +87,7 @@ class RestTransport implements DataConnectTransport {
if (appCheckToken != null) {
headers['X-Firebase-AppCheck'] = appCheckToken;
}
headers['x-firebase-gmpid'] = appId;

Map<String, dynamic> body = {
'name':
Expand Down Expand Up @@ -148,6 +154,7 @@ class RestTransport implements DataConnectTransport {
DataConnectTransport getTransport(
TransportOptions transportOptions,
DataConnectOptions options,
String appId,
FirebaseAuth? auth,
FirebaseAppCheck? appCheck) =>
RestTransport(transportOptions, options, auth, appCheck);
RestTransport(transportOptions, options, appId, auth, appCheck);
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@ part of firebase_data_connect_transport;
/// Default TransportStub to satisfy compilation of the library.
class TransportStub implements DataConnectTransport {
/// Constructor.
TransportStub(this.transportOptions, this.options, this.auth, this.appCheck);
TransportStub(
this.transportOptions,
this.options,
this.appId,
this.auth,
this.appCheck,
);

/// FirebaseAuth
@override
Expand All @@ -25,6 +31,9 @@ class TransportStub implements DataConnectTransport {
@override
TransportOptions transportOptions;

@override
String appId;

/// Stub for invoking a mutation.
@override
Future<Data> invokeMutation<Data, Variables>(
Expand All @@ -49,8 +58,10 @@ class TransportStub implements DataConnectTransport {
}

DataConnectTransport getTransport(
TransportOptions transportOptions,
DataConnectOptions options,
FirebaseAuth? auth,
FirebaseAppCheck? appCheck) =>
TransportStub(transportOptions, options, auth, appCheck);
TransportOptions transportOptions,
DataConnectOptions options,
String appId,
FirebaseAuth? auth,
FirebaseAppCheck? appCheck,
) =>
TransportStub(transportOptions, options, appId, auth, appCheck);
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ void main() {
transport = TestDataConnectTransport(
transportOptions,
dataConnectOptions,
'testAppId',
auth: mockFirebaseAuth,
appCheck: mockFirebaseAppCheck,
);
Expand All @@ -79,17 +80,17 @@ void main() {
test('should handle invokeQuery with proper deserializer', () async {
final queryName = 'testQuery';
final deserializer = (json) => json;
final result =
await transport.invokeQuery(queryName, deserializer, null, null);
final result = await transport.invokeQuery(
queryName, deserializer, emptySerializer, null);

expect(result, isNotNull);
});

test('should handle invokeMutation with proper deserializer', () async {
final queryName = 'testMutation';
final deserializer = (json) => json;
final result =
await transport.invokeMutation(queryName, deserializer, null, null);
final result = await transport.invokeMutation(
queryName, deserializer, emptySerializer, null);

expect(result, isNotNull);
});
Expand All @@ -98,10 +99,10 @@ void main() {

// Test class extending DataConnectTransport for testing purposes
class TestDataConnectTransport extends DataConnectTransport {
TestDataConnectTransport(
TransportOptions transportOptions, DataConnectOptions options,
TestDataConnectTransport(TransportOptions transportOptions,
DataConnectOptions options, String appId,
{FirebaseAuth? auth, FirebaseAppCheck? appCheck})
: super(transportOptions, options) {
: super(transportOptions, options, appId) {
this.auth = auth;
this.appCheck = appCheck;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ void main() {
'testConnector',
'testService',
),
'testAppId',
mockAuth,
mockAppCheck,
);
Expand All @@ -64,6 +65,7 @@ void main() {
'testConnector',
'testService',
),
'testAppId',
mockAuth,
mockAppCheck,
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ void main() {
final transportStub = TransportStub(
mockTransportOptions,
mockDataConnectOptions,
'mockAppId',
mockAuth,
mockAppCheck,
);
Expand All @@ -50,6 +51,7 @@ void main() {
final transportStub = TransportStub(
mockTransportOptions,
mockDataConnectOptions,
'mockAppId',
mockAuth,
mockAppCheck,
);
Expand All @@ -69,6 +71,7 @@ void main() {
final transportStub = TransportStub(
mockTransportOptions,
mockDataConnectOptions,
'mockAppId',
mockAuth,
mockAppCheck,
);
Expand Down

0 comments on commit 3a2ad61

Please sign in to comment.