Skip to content

Commit f21473d

Browse files
committed
Add option to enable compression on iOS
1 parent 7acd53b commit f21473d

2 files changed

Lines changed: 36 additions & 4 deletions

File tree

ios/Grpc.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ @interface RCT_EXTERN_MODULE(Grpc, RCTEventEmitter)
1212
RCT_EXTERN_METHOD(setHost:
1313
(NSString *) host)
1414

15+
RCT_EXTERN_METHOD(setCompression:
16+
(nonnull NSNumber*)enabled
17+
compressorName: (NSString *) compressorName)
18+
1519
RCT_EXTERN_METHOD(getIsInsecure:
1620
(RCTPromiseResolveBlock) resolve reject:
1721
(RCTPromiseRejectBlock) reject)

ios/RNGrpc.swift

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class RNGrpc: RCTEventEmitter {
1919
var grpcInsecure = false
2020
var grpcHost: String?
2121
var grpcResponseSizeLimit: Int?
22+
var grpcCompression: Bool?
23+
var grpcCompressorName: String?
2224
var calls = [Int: GrpcCall]()
2325

2426
deinit {
@@ -35,6 +37,12 @@ class RNGrpc: RCTEventEmitter {
3537
self.grpcHost = host
3638
}
3739

40+
@objc
41+
public func setCompression(_ enabled: NSNumber, compressorName: String) {
42+
self.grpcCompression = enabled.boolValue
43+
self.grpcCompressorName = compressorName
44+
}
45+
3846
@objc
3947
public func setResponseSizeLimit(_ responseSizeLimit: NSNumber) {
4048
self.grpcResponseSizeLimit = responseSizeLimit.intValue
@@ -43,7 +51,7 @@ class RNGrpc: RCTEventEmitter {
4351
@objc
4452
public func getResponseSizeLimit(_ resolve: @escaping RCTPromiseResolveBlock,
4553
reject: @escaping RCTPromiseRejectBlock) {
46-
resolve(self.grpcResponseSizeLimit);
54+
resolve(self.grpcResponseSizeLimit)
4755
}
4856

4957
@objc
@@ -299,9 +307,29 @@ class RNGrpc: RCTEventEmitter {
299307
}
300308

301309
private func getCallOptionsWithHeaders(headers: HPACKHeaders) -> CallOptions {
302-
let encoding = ClientMessageEncoding.enabled(
303-
.responsesOnly(acceptable: CompressionAlgorithm.all, decompressionLimit: .ratio(20))
304-
)
310+
var encoding: ClientMessageEncoding = .disabled
311+
312+
if let enabled = self.grpcCompression, enabled {
313+
let compressionAlgorithm: [CompressionAlgorithm]
314+
315+
switch self.grpcCompressorName {
316+
case "gzip":
317+
compressionAlgorithm = [.gzip]
318+
case "deflate":
319+
compressionAlgorithm = [.deflate]
320+
case "identity":
321+
compressionAlgorithm = [.identity]
322+
default:
323+
compressionAlgorithm = CompressionAlgorithm.all
324+
}
325+
326+
encoding = ClientMessageEncoding.enabled(
327+
.init(forRequests: compressionAlgorithm.first,
328+
acceptableForResponses: compressionAlgorithm,
329+
decompressionLimit: .ratio(20)
330+
)
331+
)
332+
}
305333

306334
return CallOptions(customMetadata: headers, messageEncoding: encoding)
307335
}

0 commit comments

Comments
 (0)