Skip to content

Commit 5322e86

Browse files
authored
fix(gql_dedupe_link)!: do not dedupe mutations by default (#489)
1 parent 9013740 commit 5322e86

File tree

5 files changed

+74
-5
lines changed

5 files changed

+74
-5
lines changed

links/gql_dedupe_link/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 3.0.0
2+
3+
- skip deduplication for mutations by default
4+
- `gql` promoted to runtime dependency
5+
16
## 2.0.3+1
27

38
- add topics

links/gql_dedupe_link/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
A GQL Link to deduplicate in-flight requests.
2424

25+
By default only queries and subscriptions are deduplicated. Mutations are always forwarded.
26+
2527
## Usage
2628

2729
A simple usage example:

links/gql_dedupe_link/lib/gql_dedupe_link.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
library gql_dedupe_link;
33

44
import "package:async/async.dart";
5+
import "package:gql/ast.dart";
56
import "package:gql_exec/gql_exec.dart";
67
import "package:gql_link/gql_link.dart";
78

@@ -10,7 +11,10 @@ class DedupeLink extends Link {
1011
final bool Function(Request request) _shouldDedupe;
1112
final Map<Request, StreamSplitter<Response>> _inFlight = {};
1213

13-
static bool _defaultShouldDedupe(Request request) => true;
14+
static bool _defaultShouldDedupe(Request request) {
15+
final type = request.operation.getOperationType();
16+
return type == null || type != OperationType.mutation;
17+
}
1418

1519
DedupeLink({
1620
bool Function(Request request) shouldDedupe = _defaultShouldDedupe,

links/gql_dedupe_link/pubspec.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
name: gql_dedupe_link
2-
version: 2.0.3+1
2+
version: 3.0.0
33
description: GQL Link to deduplicate identical in-flight execution requests
44
repository: https://github.com/gql-dart/gql
55
environment:
66
sdk: '>=2.12.0 <4.0.0'
7-
dependencies:
7+
dependencies:
88
async: ^2.5.0
9+
gql: ^1.0.0
910
gql_exec: ^1.0.0
1011
gql_link: ^1.0.0
1112
meta: ^1.3.0
12-
dev_dependencies:
13-
gql: ^1.0.0
13+
dev_dependencies:
1414
gql_pedantic: ^1.0.2
1515
mockito: ^5.0.0-nullsafety.7
1616
test: ^1.16.2

links/gql_dedupe_link/test/gql_dedupe_link_test.dart

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,64 @@ void main() {
185185
expect(await return2, result1);
186186
});
187187

188+
test("does not dedupe identical mutations", () async {
189+
final document = parseString(
190+
"""
191+
mutation withVar(\$i: Int) {
192+
take(i: \$i)
193+
}
194+
""",
195+
);
196+
197+
final req1 = Request(
198+
operation: Operation(
199+
document: document,
200+
),
201+
variables: const <String, dynamic>{"i": 12},
202+
);
203+
204+
final req2 = Request(
205+
operation: Operation(
206+
document: document,
207+
),
208+
variables: const <String, dynamic>{"i": 12},
209+
);
210+
211+
const result1Data = <String, dynamic>{"a": 1};
212+
final result1 = Response(
213+
data: result1Data,
214+
response: const <String, dynamic>{"data": result1Data},
215+
);
216+
217+
final mockLink = MockLink();
218+
219+
when(
220+
mockLink.request(req1, null),
221+
).thenAnswer(
222+
(_) => Stream.fromIterable([result1]),
223+
);
224+
225+
when(
226+
mockLink.request(req2, null),
227+
).thenAnswer(
228+
(_) => Stream.fromIterable([result1]),
229+
);
230+
231+
final link = Link.from([
232+
DedupeLink(),
233+
mockLink,
234+
]);
235+
236+
final stream1 = link.request(req1);
237+
final stream2 = link.request(req2);
238+
239+
verify(
240+
mockLink.request(req1, null),
241+
).called(2);
242+
expect(await stream1.first, result1);
243+
expect(await stream2.first, result1);
244+
});
245+
188246
test(
189247
"does not dedupe identical queries if shouldDedupe is false for request",
190248
() async {

0 commit comments

Comments
 (0)