relay-runtime 10.1.3 → 11.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/handlers/connection/ConnectionHandler.js.flow +60 -0
- package/handlers/connection/MutationHandlers.js.flow +28 -0
- package/index.js +1 -1
- package/index.js.flow +9 -3
- package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
- package/lib/handlers/connection/ConnectionHandler.js +68 -6
- package/lib/handlers/connection/MutationHandlers.js +67 -8
- package/lib/index.js +3 -0
- package/lib/multi-actor-environment/ActorIdentifier.js +23 -0
- package/lib/multi-actor-environment/ActorSpecificEnvironment.js +108 -0
- package/lib/multi-actor-environment/MultiActorEnvironment.js +156 -0
- package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
- package/lib/multi-actor-environment/index.js +17 -0
- package/lib/mutations/RelayRecordProxy.js +1 -1
- package/lib/mutations/RelayRecordSourceMutator.js +1 -1
- package/lib/mutations/RelayRecordSourceProxy.js +1 -1
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -1
- package/lib/mutations/applyOptimisticMutation.js +1 -1
- package/lib/mutations/commitMutation.js +1 -1
- package/lib/mutations/validateMutation.js +36 -15
- package/lib/network/RelayNetwork.js +1 -1
- package/lib/network/RelayQueryResponseCache.js +3 -2
- package/lib/query/GraphQLTag.js +1 -1
- package/lib/query/fetchQuery.js +129 -13
- package/lib/query/fetchQueryInternal.js +3 -4
- package/lib/query/fetchQuery_DEPRECATED.js +39 -0
- package/lib/store/DataChecker.js +26 -14
- package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +117 -47
- package/lib/store/RelayConcreteVariables.js +8 -4
- package/lib/store/RelayModernEnvironment.js +105 -136
- package/lib/store/RelayModernFragmentSpecResolver.js +16 -9
- package/lib/store/RelayModernRecord.js +1 -1
- package/lib/store/RelayModernSelector.js +1 -1
- package/lib/store/RelayModernStore.js +19 -20
- package/lib/store/RelayOperationTracker.js +55 -49
- package/lib/store/RelayPublishQueue.js +9 -5
- package/lib/store/RelayReader.js +68 -14
- package/lib/store/RelayReferenceMarker.js +28 -14
- package/lib/store/RelayResponseNormalizer.js +109 -15
- package/lib/store/RelayStoreReactFlightUtils.js +6 -4
- package/lib/store/RelayStoreSubscriptions.js +18 -8
- package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +90 -30
- package/lib/store/RelayStoreUtils.js +3 -2
- package/lib/store/ResolverFragments.js +57 -0
- package/lib/store/cloneRelayHandleSourceField.js +1 -1
- package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
- package/lib/store/createFragmentSpecResolver.js +2 -2
- package/lib/store/createRelayContext.js +1 -1
- package/lib/store/defaultGetDataID.js +3 -1
- package/lib/store/hasOverlappingIDs.js +11 -3
- package/lib/store/readInlineData.js +1 -1
- package/lib/subscription/requestSubscription.js +33 -5
- package/lib/util/RelayConcreteNode.js +2 -0
- package/lib/util/RelayFeatureFlags.js +8 -3
- package/lib/util/RelayProfiler.js +17 -187
- package/lib/util/RelayReplaySubject.js +1 -1
- package/lib/util/deepFreeze.js +1 -0
- package/lib/util/getRelayHandleKey.js +1 -1
- package/lib/util/getRequestIdentifier.js +1 -1
- package/multi-actor-environment/ActorIdentifier.js.flow +27 -0
- package/multi-actor-environment/ActorSpecificEnvironment.js.flow +189 -0
- package/multi-actor-environment/MultiActorEnvironment.js.flow +233 -0
- package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +196 -0
- package/multi-actor-environment/index.js.flow +24 -0
- package/mutations/RelayRecordSourceProxy.js.flow +3 -2
- package/mutations/commitMutation.js.flow +1 -1
- package/mutations/validateMutation.js.flow +40 -15
- package/network/RelayNetworkTypes.js.flow +31 -11
- package/network/RelayQueryResponseCache.js.flow +2 -1
- package/package.json +3 -2
- package/query/fetchQuery.js.flow +147 -20
- package/query/fetchQueryInternal.js.flow +2 -3
- package/query/fetchQuery_DEPRECATED.js.flow +47 -0
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/DataChecker.js.flow +23 -15
- package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +128 -40
- package/store/RelayConcreteVariables.js.flow +5 -0
- package/store/RelayModernEnvironment.js.flow +100 -130
- package/store/RelayModernFragmentSpecResolver.js.flow +30 -8
- package/store/RelayModernStore.js.flow +28 -24
- package/store/RelayOperationTracker.js.flow +69 -56
- package/store/RelayPublishQueue.js.flow +7 -4
- package/store/RelayReader.js.flow +63 -11
- package/store/RelayRecordSource.js.flow +3 -3
- package/store/RelayRecordSourceMapImpl.js.flow +6 -2
- package/store/RelayReferenceMarker.js.flow +28 -18
- package/store/RelayResponseNormalizer.js.flow +134 -23
- package/store/RelayStoreReactFlightUtils.js.flow +9 -4
- package/store/RelayStoreSubscriptions.js.flow +22 -7
- package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +36 -12
- package/store/RelayStoreTypes.js.flow +51 -22
- package/store/RelayStoreUtils.js.flow +2 -1
- package/store/ResolverFragments.js.flow +125 -0
- package/store/createFragmentSpecResolver.js.flow +2 -0
- package/store/defaultGetDataID.js.flow +3 -1
- package/store/hasOverlappingIDs.js.flow +11 -9
- package/subscription/requestSubscription.js.flow +25 -2
- package/util/NormalizationNode.js.flow +13 -0
- package/util/ReaderNode.js.flow +14 -1
- package/util/RelayConcreteNode.js.flow +2 -0
- package/util/RelayFeatureFlags.js.flow +12 -2
- package/util/RelayProfiler.js.flow +22 -194
- package/util/RelayRuntimeTypes.js.flow +4 -5
- package/util/deepFreeze.js.flow +2 -1
- package/util/isEmptyObject.js.flow +1 -1
|
@@ -20,19 +20,19 @@ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
|
20
20
|
|
|
21
21
|
var RelayModernRecord = require('./RelayModernRecord');
|
|
22
22
|
|
|
23
|
-
var RelayProfiler = require('../util/RelayProfiler');
|
|
24
|
-
|
|
25
23
|
var areEqual = require("fbjs/lib/areEqual");
|
|
26
24
|
|
|
27
|
-
var invariant = require(
|
|
25
|
+
var invariant = require('invariant');
|
|
28
26
|
|
|
29
27
|
var warning = require("fbjs/lib/warning");
|
|
30
28
|
|
|
31
29
|
var _require = require('../util/RelayConcreteNode'),
|
|
32
30
|
CONDITION = _require.CONDITION,
|
|
31
|
+
CLIENT_COMPONENT = _require.CLIENT_COMPONENT,
|
|
33
32
|
CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
|
|
34
33
|
DEFER = _require.DEFER,
|
|
35
34
|
FLIGHT_FIELD = _require.FLIGHT_FIELD,
|
|
35
|
+
FRAGMENT_SPREAD = _require.FRAGMENT_SPREAD,
|
|
36
36
|
INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
|
|
37
37
|
LINKED_FIELD = _require.LINKED_FIELD,
|
|
38
38
|
LINKED_HANDLE = _require.LINKED_HANDLE,
|
|
@@ -51,7 +51,7 @@ var _require3 = require('./RelayModernSelector'),
|
|
|
51
51
|
|
|
52
52
|
var _require4 = require('./RelayStoreReactFlightUtils'),
|
|
53
53
|
refineToReactFlightPayloadData = _require4.refineToReactFlightPayloadData,
|
|
54
|
-
|
|
54
|
+
REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require4.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
|
|
55
55
|
REACT_FLIGHT_TREE_STORAGE_KEY = _require4.REACT_FLIGHT_TREE_STORAGE_KEY,
|
|
56
56
|
REACT_FLIGHT_TYPE_NAME = _require4.REACT_FLIGHT_TYPE_NAME;
|
|
57
57
|
|
|
@@ -100,6 +100,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
100
100
|
this._recordSource = recordSource;
|
|
101
101
|
this._variables = variables;
|
|
102
102
|
this._reactFlightPayloadDeserializer = options.reactFlightPayloadDeserializer;
|
|
103
|
+
this._reactFlightServerErrorHandler = options.reactFlightServerErrorHandler;
|
|
104
|
+
this._shouldProcessClientComponents = options.shouldProcessClientComponents;
|
|
103
105
|
}
|
|
104
106
|
|
|
105
107
|
var _proto = RelayResponseNormalizer.prototype;
|
|
@@ -122,7 +124,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
122
124
|
};
|
|
123
125
|
|
|
124
126
|
_proto._getVariableValue = function _getVariableValue(name) {
|
|
125
|
-
!this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0;
|
|
127
|
+
!this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
|
|
128
|
+
|
|
126
129
|
return this._variables[name];
|
|
127
130
|
};
|
|
128
131
|
|
|
@@ -152,6 +155,13 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
152
155
|
|
|
153
156
|
break;
|
|
154
157
|
|
|
158
|
+
case FRAGMENT_SPREAD:
|
|
159
|
+
{
|
|
160
|
+
this._traverseSelections(selection.fragment, record, data);
|
|
161
|
+
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
|
|
155
165
|
case INLINE_FRAGMENT:
|
|
156
166
|
{
|
|
157
167
|
var abstractKey = selection.abstractKey;
|
|
@@ -265,6 +275,15 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
265
275
|
this._isClientExtension = isClientExtension;
|
|
266
276
|
break;
|
|
267
277
|
|
|
278
|
+
case CLIENT_COMPONENT:
|
|
279
|
+
if (this._shouldProcessClientComponents === false) {
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
this._traverseSelections(selection.fragment, record, data);
|
|
284
|
+
|
|
285
|
+
break;
|
|
286
|
+
|
|
268
287
|
case FLIGHT_FIELD:
|
|
269
288
|
if (RelayFeatureFlags.ENABLE_REACT_FLIGHT_COMPONENT_FIELD) {
|
|
270
289
|
this._normalizeFlightField(node, selection, record, data);
|
|
@@ -426,17 +445,45 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
426
445
|
var fieldValue = data[responseKey];
|
|
427
446
|
|
|
428
447
|
if (fieldValue == null) {
|
|
448
|
+
if (fieldValue === undefined) {
|
|
449
|
+
// Flight field may be missing in the response if:
|
|
450
|
+
// - It is inside an abstract type refinement where the concrete type does
|
|
451
|
+
// not conform to the interface/union.
|
|
452
|
+
// However an otherwise-required field may also be missing if the server
|
|
453
|
+
// is configured to skip fields with `null` values, in which case the
|
|
454
|
+
// client is assumed to be correctly configured with
|
|
455
|
+
// treatMissingFieldsAsNull=true.
|
|
456
|
+
if (this._isUnmatchedAbstractType) {
|
|
457
|
+
// Field not expected to exist regardless of whether the server is pruning null
|
|
458
|
+
// fields or not.
|
|
459
|
+
return;
|
|
460
|
+
} else if (!this._treatMissingFieldsAsNull) {
|
|
461
|
+
// Not optional and the server is not pruning null fields: field is expected
|
|
462
|
+
// to be present
|
|
463
|
+
if (process.env.NODE_ENV !== "production") {
|
|
464
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : void 0;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
429
471
|
RelayModernRecord.setValue(record, storageKey, null);
|
|
430
472
|
return;
|
|
431
473
|
}
|
|
432
474
|
|
|
433
475
|
var reactFlightPayload = refineToReactFlightPayloadData(fieldValue);
|
|
434
|
-
|
|
435
|
-
!(
|
|
436
|
-
|
|
437
|
-
// tree later even if the parent record is still reachable.
|
|
476
|
+
var reactFlightPayloadDeserializer = this._reactFlightPayloadDeserializer;
|
|
477
|
+
!(reactFlightPayload != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected React Flight payload data to be an ' + 'object with `status`, tree`, `queries` and `errors` properties, got ' + '`%s`.', fieldValue) : invariant(false) : void 0;
|
|
478
|
+
!(typeof reactFlightPayloadDeserializer === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected reactFlightPayloadDeserializer to ' + 'be a function, got `%s`.', reactFlightPayloadDeserializer) : invariant(false) : void 0;
|
|
438
479
|
|
|
439
|
-
|
|
480
|
+
if (reactFlightPayload.errors.length > 0) {
|
|
481
|
+
if (typeof this._reactFlightServerErrorHandler === 'function') {
|
|
482
|
+
this._reactFlightServerErrorHandler(reactFlightPayload.status, reactFlightPayload.errors);
|
|
483
|
+
} else {
|
|
484
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Received server errors for field `%s`.\n\n' + '%s\n%s', responseKey, reactFlightPayload.errors[0].message, reactFlightPayload.errors[0].stack) : void 0;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
440
487
|
|
|
441
488
|
var reactFlightID = generateClientID(RelayModernRecord.getDataID(record), getStorageKey(selection, this._variables));
|
|
442
489
|
|
|
@@ -448,8 +495,27 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
448
495
|
this._recordSource.set(reactFlightID, reactFlightClientResponseRecord);
|
|
449
496
|
}
|
|
450
497
|
|
|
498
|
+
if (reactFlightPayload.tree == null) {
|
|
499
|
+
// This typically indicates that a fatal server error prevented rows from
|
|
500
|
+
// being written. When this occurs, we should not continue normalization of
|
|
501
|
+
// the Flight field because the row response is malformed.
|
|
502
|
+
//
|
|
503
|
+
// Receiving empty rows is OK because it can indicate the start of a stream.
|
|
504
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Expected `tree` not to be null. This ' + 'typically indicates that a fatal server error prevented any Server ' + 'Component rows from being written.') : void 0; // We create the flight record with a null value for the tree
|
|
505
|
+
// and empty reachable definitions
|
|
506
|
+
|
|
507
|
+
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, null);
|
|
508
|
+
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, []);
|
|
509
|
+
RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
|
|
510
|
+
return;
|
|
511
|
+
} // We store the deserialized reactFlightClientResponse in a separate
|
|
512
|
+
// record and link it to the parent record. This is so we can GC the Flight
|
|
513
|
+
// tree later even if the parent record is still reachable.
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
var reactFlightClientResponse = reactFlightPayloadDeserializer(reactFlightPayload.tree);
|
|
451
517
|
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, reactFlightClientResponse);
|
|
452
|
-
var
|
|
518
|
+
var reachableExecutableDefinitions = [];
|
|
453
519
|
|
|
454
520
|
var _iterator = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.queries),
|
|
455
521
|
_step;
|
|
@@ -469,7 +535,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
469
535
|
});
|
|
470
536
|
}
|
|
471
537
|
|
|
472
|
-
|
|
538
|
+
reachableExecutableDefinitions.push({
|
|
473
539
|
module: query.module,
|
|
474
540
|
variables: query.variables
|
|
475
541
|
});
|
|
@@ -480,7 +546,36 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
480
546
|
_iterator.f();
|
|
481
547
|
}
|
|
482
548
|
|
|
483
|
-
|
|
549
|
+
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.fragments),
|
|
550
|
+
_step2;
|
|
551
|
+
|
|
552
|
+
try {
|
|
553
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
554
|
+
var fragment = _step2.value;
|
|
555
|
+
|
|
556
|
+
if (fragment.response.data != null) {
|
|
557
|
+
this._moduleImportPayloads.push({
|
|
558
|
+
data: fragment.response.data,
|
|
559
|
+
dataID: fragment.__id,
|
|
560
|
+
operationReference: fragment.module,
|
|
561
|
+
path: [],
|
|
562
|
+
typeName: fragment.__typename,
|
|
563
|
+
variables: fragment.variables
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
reachableExecutableDefinitions.push({
|
|
568
|
+
module: fragment.module,
|
|
569
|
+
variables: fragment.variables
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
} catch (err) {
|
|
573
|
+
_iterator2.e(err);
|
|
574
|
+
} finally {
|
|
575
|
+
_iterator2.f();
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, reachableExecutableDefinitions);
|
|
484
579
|
RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
|
|
485
580
|
};
|
|
486
581
|
|
|
@@ -610,7 +705,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
610
705
|
return RelayResponseNormalizer;
|
|
611
706
|
}();
|
|
612
707
|
|
|
613
|
-
var instrumentedNormalize = RelayProfiler.instrument('RelayResponseNormalizer.normalize', normalize);
|
|
614
708
|
module.exports = {
|
|
615
|
-
normalize:
|
|
709
|
+
normalize: normalize
|
|
616
710
|
};
|
|
@@ -10,17 +10,19 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var invariant = require(
|
|
13
|
+
var invariant = require('invariant');
|
|
14
14
|
|
|
15
15
|
var _require = require('./RelayModernRecord'),
|
|
16
16
|
getType = _require.getType;
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
// Reachable (client) executable definitions encountered while server component
|
|
19
|
+
// rendering
|
|
20
|
+
var REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = 'executableDefinitions';
|
|
19
21
|
var REACT_FLIGHT_TREE_STORAGE_KEY = 'tree';
|
|
20
22
|
var REACT_FLIGHT_TYPE_NAME = 'ReactFlightComponent';
|
|
21
23
|
|
|
22
24
|
function refineToReactFlightPayloadData(payload) {
|
|
23
|
-
if (payload == null || typeof payload !== 'object' || !Array.isArray(payload.tree) || !Array.isArray(payload.queries)) {
|
|
25
|
+
if (payload == null || typeof payload !== 'object' || typeof payload.status !== 'string' || !Array.isArray(payload.tree) && payload.tree !== null || !Array.isArray(payload.queries) || !Array.isArray(payload.fragments) || !Array.isArray(payload.errors)) {
|
|
24
26
|
return null;
|
|
25
27
|
}
|
|
26
28
|
|
|
@@ -39,7 +41,7 @@ function getReactFlightClientResponse(record) {
|
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
module.exports = {
|
|
42
|
-
|
|
44
|
+
REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY: REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
|
|
43
45
|
REACT_FLIGHT_TREE_STORAGE_KEY: REACT_FLIGHT_TREE_STORAGE_KEY,
|
|
44
46
|
REACT_FLIGHT_TYPE_NAME: REACT_FLIGHT_TYPE_NAME,
|
|
45
47
|
getReactFlightClientResponse: getReactFlightClientResponse,
|
|
@@ -10,19 +10,20 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
+
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
14
|
+
|
|
13
15
|
var RelayReader = require('./RelayReader');
|
|
14
16
|
|
|
15
17
|
var deepFreeze = require('../util/deepFreeze');
|
|
16
18
|
|
|
17
19
|
var hasOverlappingIDs = require('./hasOverlappingIDs');
|
|
18
20
|
|
|
19
|
-
var isEmptyObject = require('../util/isEmptyObject');
|
|
20
|
-
|
|
21
21
|
var recycleNodesInto = require('../util/recycleNodesInto');
|
|
22
22
|
|
|
23
23
|
var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
24
|
-
function RelayStoreSubscriptions() {
|
|
24
|
+
function RelayStoreSubscriptions(log) {
|
|
25
25
|
this._subscriptions = new Set();
|
|
26
|
+
this.__log = log;
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
var _proto = RelayStoreSubscriptions.prototype;
|
|
@@ -59,7 +60,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
59
60
|
// but its base has changed (we just applied a final payload): recompute
|
|
60
61
|
// a backup so that we can later restore to the state the subscription
|
|
61
62
|
// should be in.
|
|
62
|
-
// - stale=false: This subscription was restored to the same value
|
|
63
|
+
// - stale=false: This subscription was restored to the same value as
|
|
63
64
|
// `snapshot`. That means this subscription does *not* have changes relative
|
|
64
65
|
// to its base, so the current `snapshot` is valid to use as a backup.
|
|
65
66
|
if (!subscription.stale) {
|
|
@@ -99,13 +100,13 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
99
100
|
});
|
|
100
101
|
};
|
|
101
102
|
|
|
102
|
-
_proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners) {
|
|
103
|
+
_proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
|
|
103
104
|
var _this2 = this;
|
|
104
105
|
|
|
105
|
-
var hasUpdatedRecords =
|
|
106
|
+
var hasUpdatedRecords = updatedRecordIDs.size !== 0;
|
|
106
107
|
|
|
107
108
|
this._subscriptions.forEach(function (subscription) {
|
|
108
|
-
var owner = _this2._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords);
|
|
109
|
+
var owner = _this2._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
|
|
109
110
|
|
|
110
111
|
if (owner != null) {
|
|
111
112
|
updatedOwners.push(owner);
|
|
@@ -122,7 +123,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
122
123
|
*/
|
|
123
124
|
;
|
|
124
125
|
|
|
125
|
-
_proto._updateSubscription = function _updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords) {
|
|
126
|
+
_proto._updateSubscription = function _updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation) {
|
|
126
127
|
var backup = subscription.backup,
|
|
127
128
|
callback = subscription.callback,
|
|
128
129
|
snapshot = subscription.snapshot,
|
|
@@ -151,6 +152,15 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
151
152
|
subscription.stale = false;
|
|
152
153
|
|
|
153
154
|
if (nextSnapshot.data !== snapshot.data) {
|
|
155
|
+
if (this.__log && RelayFeatureFlags.ENABLE_NOTIFY_SUBSCRIPTION) {
|
|
156
|
+
this.__log({
|
|
157
|
+
name: 'store.notify.subscription',
|
|
158
|
+
sourceOperation: sourceOperation,
|
|
159
|
+
snapshot: snapshot,
|
|
160
|
+
nextSnapshot: nextSnapshot
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
154
164
|
callback(nextSnapshot);
|
|
155
165
|
return snapshot.selector.owner;
|
|
156
166
|
}
|
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
14
|
+
|
|
15
|
+
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
16
|
+
|
|
17
|
+
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
18
|
+
|
|
13
19
|
var RelayReader = require('./RelayReader');
|
|
14
20
|
|
|
15
21
|
var deepFreeze = require('../util/deepFreeze');
|
|
@@ -17,11 +23,12 @@ var deepFreeze = require('../util/deepFreeze');
|
|
|
17
23
|
var recycleNodesInto = require('../util/recycleNodesInto');
|
|
18
24
|
|
|
19
25
|
var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
|
|
20
|
-
function RelayStoreSubscriptionsUsingMapByID() {
|
|
26
|
+
function RelayStoreSubscriptionsUsingMapByID(log) {
|
|
21
27
|
this._notifiedRevision = 0;
|
|
22
28
|
this._snapshotRevision = 0;
|
|
23
29
|
this._subscriptionsByDataId = new Map();
|
|
24
30
|
this._staleSubscriptions = new Set();
|
|
31
|
+
this.__log = log;
|
|
25
32
|
}
|
|
26
33
|
|
|
27
34
|
var _proto = RelayStoreSubscriptionsUsingMapByID.prototype;
|
|
@@ -38,27 +45,49 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
|
|
|
38
45
|
};
|
|
39
46
|
|
|
40
47
|
var dispose = function dispose() {
|
|
41
|
-
|
|
42
|
-
|
|
48
|
+
var _iterator = (0, _createForOfIteratorHelper2["default"])(snapshot.seenRecords),
|
|
49
|
+
_step;
|
|
43
50
|
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
try {
|
|
52
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
53
|
+
var dataId = _step.value;
|
|
46
54
|
|
|
47
|
-
|
|
48
|
-
|
|
55
|
+
var subscriptionsForDataId = _this._subscriptionsByDataId.get(dataId);
|
|
56
|
+
|
|
57
|
+
if (subscriptionsForDataId != null) {
|
|
58
|
+
subscriptionsForDataId["delete"](subscription);
|
|
59
|
+
|
|
60
|
+
if (subscriptionsForDataId.size === 0) {
|
|
61
|
+
_this._subscriptionsByDataId["delete"](dataId);
|
|
62
|
+
}
|
|
49
63
|
}
|
|
50
64
|
}
|
|
65
|
+
} catch (err) {
|
|
66
|
+
_iterator.e(err);
|
|
67
|
+
} finally {
|
|
68
|
+
_iterator.f();
|
|
51
69
|
}
|
|
52
70
|
};
|
|
53
71
|
|
|
54
|
-
|
|
55
|
-
|
|
72
|
+
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(snapshot.seenRecords),
|
|
73
|
+
_step2;
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
77
|
+
var dataId = _step2.value;
|
|
78
|
+
|
|
79
|
+
var subscriptionsForDataId = this._subscriptionsByDataId.get(dataId);
|
|
56
80
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
81
|
+
if (subscriptionsForDataId != null) {
|
|
82
|
+
subscriptionsForDataId.add(subscription);
|
|
83
|
+
} else {
|
|
84
|
+
this._subscriptionsByDataId.set(dataId, new Set([subscription]));
|
|
85
|
+
}
|
|
61
86
|
}
|
|
87
|
+
} catch (err) {
|
|
88
|
+
_iterator2.e(err);
|
|
89
|
+
} finally {
|
|
90
|
+
_iterator2.f();
|
|
62
91
|
}
|
|
63
92
|
|
|
64
93
|
return {
|
|
@@ -142,11 +171,11 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
|
|
|
142
171
|
});
|
|
143
172
|
};
|
|
144
173
|
|
|
145
|
-
_proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners) {
|
|
174
|
+
_proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
|
|
146
175
|
var _this4 = this;
|
|
147
176
|
|
|
148
177
|
this._notifiedRevision++;
|
|
149
|
-
|
|
178
|
+
updatedRecordIDs.forEach(function (updatedRecordId) {
|
|
150
179
|
var subcriptionsForDataId = _this4._subscriptionsByDataId.get(updatedRecordId);
|
|
151
180
|
|
|
152
181
|
if (subcriptionsForDataId == null) {
|
|
@@ -158,7 +187,7 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
|
|
|
158
187
|
return;
|
|
159
188
|
}
|
|
160
189
|
|
|
161
|
-
var owner = _this4._updateSubscription(source, subscription, false);
|
|
190
|
+
var owner = _this4._updateSubscription(source, subscription, false, sourceOperation);
|
|
162
191
|
|
|
163
192
|
if (owner != null) {
|
|
164
193
|
updatedOwners.push(owner);
|
|
@@ -171,7 +200,7 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
|
|
|
171
200
|
return;
|
|
172
201
|
}
|
|
173
202
|
|
|
174
|
-
var owner = _this4._updateSubscription(source, subscription, true);
|
|
203
|
+
var owner = _this4._updateSubscription(source, subscription, true, sourceOperation);
|
|
175
204
|
|
|
176
205
|
if (owner != null) {
|
|
177
206
|
updatedOwners.push(owner);
|
|
@@ -191,7 +220,7 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
|
|
|
191
220
|
*/
|
|
192
221
|
;
|
|
193
222
|
|
|
194
|
-
_proto._updateSubscription = function _updateSubscription(source, subscription, stale) {
|
|
223
|
+
_proto._updateSubscription = function _updateSubscription(source, subscription, stale, sourceOperation) {
|
|
195
224
|
var backup = subscription.backup,
|
|
196
225
|
callback = subscription.callback,
|
|
197
226
|
snapshot = subscription.snapshot;
|
|
@@ -216,6 +245,15 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
|
|
|
216
245
|
this._updateSubscriptionsMap(subscription, prevSeenRecords);
|
|
217
246
|
|
|
218
247
|
if (nextSnapshot.data !== snapshot.data) {
|
|
248
|
+
if (this.__log && RelayFeatureFlags.ENABLE_NOTIFY_SUBSCRIPTION) {
|
|
249
|
+
this.__log({
|
|
250
|
+
name: 'store.notify.subscription',
|
|
251
|
+
sourceOperation: sourceOperation,
|
|
252
|
+
snapshot: snapshot,
|
|
253
|
+
nextSnapshot: nextSnapshot
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
219
257
|
callback(nextSnapshot);
|
|
220
258
|
return snapshot.selector.owner;
|
|
221
259
|
}
|
|
@@ -229,26 +267,48 @@ var RelayStoreSubscriptionsUsingMapByID = /*#__PURE__*/function () {
|
|
|
229
267
|
;
|
|
230
268
|
|
|
231
269
|
_proto._updateSubscriptionsMap = function _updateSubscriptionsMap(subscription, prevSeenRecords) {
|
|
232
|
-
|
|
233
|
-
|
|
270
|
+
var _iterator3 = (0, _createForOfIteratorHelper2["default"])(prevSeenRecords),
|
|
271
|
+
_step3;
|
|
272
|
+
|
|
273
|
+
try {
|
|
274
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
275
|
+
var dataId = _step3.value;
|
|
234
276
|
|
|
235
|
-
|
|
236
|
-
|
|
277
|
+
var subscriptionsForDataId = this._subscriptionsByDataId.get(dataId);
|
|
278
|
+
|
|
279
|
+
if (subscriptionsForDataId != null) {
|
|
280
|
+
subscriptionsForDataId["delete"](subscription);
|
|
237
281
|
|
|
238
|
-
|
|
239
|
-
|
|
282
|
+
if (subscriptionsForDataId.size === 0) {
|
|
283
|
+
this._subscriptionsByDataId["delete"](dataId);
|
|
284
|
+
}
|
|
240
285
|
}
|
|
241
286
|
}
|
|
287
|
+
} catch (err) {
|
|
288
|
+
_iterator3.e(err);
|
|
289
|
+
} finally {
|
|
290
|
+
_iterator3.f();
|
|
242
291
|
}
|
|
243
292
|
|
|
244
|
-
|
|
245
|
-
|
|
293
|
+
var _iterator4 = (0, _createForOfIteratorHelper2["default"])(subscription.snapshot.seenRecords),
|
|
294
|
+
_step4;
|
|
295
|
+
|
|
296
|
+
try {
|
|
297
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
298
|
+
var _dataId = _step4.value;
|
|
246
299
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
300
|
+
var _subscriptionsForDataId = this._subscriptionsByDataId.get(_dataId);
|
|
301
|
+
|
|
302
|
+
if (_subscriptionsForDataId != null) {
|
|
303
|
+
_subscriptionsForDataId.add(subscription);
|
|
304
|
+
} else {
|
|
305
|
+
this._subscriptionsByDataId.set(_dataId, new Set([subscription]));
|
|
306
|
+
}
|
|
251
307
|
}
|
|
308
|
+
} catch (err) {
|
|
309
|
+
_iterator4.e(err);
|
|
310
|
+
} finally {
|
|
311
|
+
_iterator4.f();
|
|
252
312
|
}
|
|
253
313
|
};
|
|
254
314
|
|
|
@@ -18,7 +18,7 @@ var RelayConcreteNode = require('../util/RelayConcreteNode');
|
|
|
18
18
|
|
|
19
19
|
var getRelayHandleKey = require('../util/getRelayHandleKey');
|
|
20
20
|
|
|
21
|
-
var invariant = require(
|
|
21
|
+
var invariant = require('invariant');
|
|
22
22
|
|
|
23
23
|
var stableCopy = require('../util/stableCopy');
|
|
24
24
|
|
|
@@ -175,7 +175,8 @@ function formatStorageKey(name, argValues) {
|
|
|
175
175
|
|
|
176
176
|
|
|
177
177
|
function getStableVariableValue(name, variables) {
|
|
178
|
-
!variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0;
|
|
178
|
+
!variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
|
|
179
|
+
|
|
179
180
|
return stableCopy(variables[name]);
|
|
180
181
|
}
|
|
181
182
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
// flowlint ambiguous-object-type:error
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
var invariant = require('invariant');
|
|
14
|
+
|
|
15
|
+
var _require = require('../query/GraphQLTag'),
|
|
16
|
+
getFragment = _require.getFragment;
|
|
17
|
+
|
|
18
|
+
var _require2 = require('./RelayModernSelector'),
|
|
19
|
+
getSelector = _require2.getSelector;
|
|
20
|
+
|
|
21
|
+
var contextStack = [];
|
|
22
|
+
|
|
23
|
+
function withResolverContext(context, cb) {
|
|
24
|
+
contextStack.push(context);
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
return cb();
|
|
28
|
+
} finally {
|
|
29
|
+
contextStack.pop();
|
|
30
|
+
}
|
|
31
|
+
} // NOTE: these declarations are copied from 'useFragment'; it would be good
|
|
32
|
+
// to figure out how to share the same type signature between the two functions.
|
|
33
|
+
// The declarations ensure that the type of the returned data is:
|
|
34
|
+
// - non-nullable if the provided ref type is non-nullable
|
|
35
|
+
// - nullable if the provided ref type is nullable
|
|
36
|
+
// - array of non-nullable if the privoided ref type is an array of
|
|
37
|
+
// non-nullable refs
|
|
38
|
+
// - array of nullable if the privoided ref type is an array of nullable refs
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
function readFragment(fragmentInput, fragmentRef) {
|
|
42
|
+
if (!contextStack.length) {
|
|
43
|
+
throw new Error('readFragment should be called only from within a Relay Resolver function.');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
var context = contextStack[contextStack.length - 1];
|
|
47
|
+
var fragmentNode = getFragment(fragmentInput);
|
|
48
|
+
var fragmentSelector = getSelector(fragmentNode, fragmentRef);
|
|
49
|
+
!(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a selector for the fragment of the resolver ".concat(fragmentNode.name, ", but got null.")) : invariant(false) : void 0;
|
|
50
|
+
!(fragmentSelector.kind === 'SingularReaderSelector') ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a singular reader selector for the fragment of the resolver ".concat(fragmentNode.name, ", but it was plural.")) : invariant(false) : void 0;
|
|
51
|
+
return context.getDataForResolverFragment(fragmentSelector);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = {
|
|
55
|
+
readFragment: readFragment,
|
|
56
|
+
withResolverContext: withResolverContext
|
|
57
|
+
};
|
|
@@ -14,7 +14,7 @@ var RelayModernFragmentSpecResolver = require('./RelayModernFragmentSpecResolver
|
|
|
14
14
|
|
|
15
15
|
var warning = require("fbjs/lib/warning");
|
|
16
16
|
|
|
17
|
-
function createFragmentSpecResolver(context, containerName, fragments, props, callback) {
|
|
17
|
+
function createFragmentSpecResolver(context, containerName, fragments, props, rootIsQueryRenderer, callback) {
|
|
18
18
|
if (process.env.NODE_ENV !== "production") {
|
|
19
19
|
var fragmentNames = Object.keys(fragments);
|
|
20
20
|
fragmentNames.forEach(function (fragmentName) {
|
|
@@ -23,7 +23,7 @@ function createFragmentSpecResolver(context, containerName, fragments, props, ca
|
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
return new RelayModernFragmentSpecResolver(context, fragments, props, callback);
|
|
26
|
+
return new RelayModernFragmentSpecResolver(context, fragments, props, callback, rootIsQueryRenderer);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
module.exports = createFragmentSpecResolver;
|
|
@@ -16,8 +16,10 @@ var _require = require('./ViewerPattern'),
|
|
|
16
16
|
|
|
17
17
|
function defaultGetDataID(fieldValue, typeName) {
|
|
18
18
|
if (typeName === VIEWER_TYPE) {
|
|
19
|
+
// $FlowFixMe[prop-missing]
|
|
19
20
|
return fieldValue.id == null ? VIEWER_ID : fieldValue.id;
|
|
20
|
-
}
|
|
21
|
+
} // $FlowFixMe[prop-missing]
|
|
22
|
+
|
|
21
23
|
|
|
22
24
|
return fieldValue.id;
|
|
23
25
|
}
|