relay-runtime 11.0.1 → 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/index.js +1 -1
- package/index.js.flow +4 -2
- package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
- package/lib/handlers/connection/ConnectionHandler.js +1 -1
- package/lib/handlers/connection/MutationHandlers.js +1 -1
- 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/network/RelayNetwork.js +1 -1
- package/lib/network/RelayQueryResponseCache.js +1 -1
- package/lib/query/GraphQLTag.js +1 -1
- package/lib/query/fetchQuery.js +1 -1
- package/lib/query/fetchQueryInternal.js +1 -1
- package/lib/store/DataChecker.js +1 -1
- package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +81 -37
- package/lib/store/RelayConcreteVariables.js +1 -1
- package/lib/store/RelayModernEnvironment.js +99 -144
- package/lib/store/RelayModernFragmentSpecResolver.js +1 -1
- package/lib/store/RelayModernRecord.js +1 -1
- package/lib/store/RelayModernSelector.js +1 -1
- package/lib/store/RelayModernStore.js +1 -6
- package/lib/store/RelayOperationTracker.js +1 -1
- package/lib/store/RelayPublishQueue.js +9 -5
- package/lib/store/RelayReader.js +63 -10
- package/lib/store/RelayReferenceMarker.js +1 -1
- package/lib/store/RelayResponseNormalizer.js +47 -22
- package/lib/store/RelayStoreReactFlightUtils.js +1 -1
- package/lib/store/RelayStoreUtils.js +1 -1
- package/lib/store/ResolverFragments.js +57 -0
- package/lib/store/cloneRelayHandleSourceField.js +1 -1
- package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
- package/lib/store/createRelayContext.js +1 -1
- package/lib/store/readInlineData.js +1 -1
- package/lib/subscription/requestSubscription.js +18 -7
- package/lib/util/RelayConcreteNode.js +1 -0
- package/lib/util/RelayFeatureFlags.js +3 -1
- package/lib/util/RelayProfiler.js +17 -187
- package/lib/util/RelayReplaySubject.js +1 -1
- 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/network/RelayNetworkTypes.js.flow +5 -4
- package/package.json +3 -2
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +82 -35
- package/store/RelayModernEnvironment.js.flow +88 -131
- package/store/RelayModernStore.js.flow +0 -5
- package/store/RelayPublishQueue.js.flow +7 -4
- package/store/RelayReader.js.flow +57 -5
- package/store/RelayResponseNormalizer.js.flow +67 -26
- package/store/RelayStoreTypes.js.flow +15 -8
- package/store/ResolverFragments.js.flow +125 -0
- package/subscription/requestSubscription.js.flow +15 -7
- package/util/ReaderNode.js.flow +14 -1
- package/util/RelayConcreteNode.js.flow +1 -0
- package/util/RelayFeatureFlags.js.flow +4 -0
- package/util/RelayProfiler.js.flow +22 -194
- package/util/RelayRuntimeTypes.js.flow +3 -1
|
@@ -14,7 +14,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
14
14
|
|
|
15
15
|
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
16
16
|
|
|
17
|
-
var invariant = require(
|
|
17
|
+
var invariant = require('invariant');
|
|
18
18
|
|
|
19
19
|
var RelayOperationTracker = /*#__PURE__*/function () {
|
|
20
20
|
function RelayOperationTracker() {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var ErrorUtils
|
|
13
|
+
var _global$ErrorUtils$ap, _global$ErrorUtils;
|
|
14
14
|
|
|
15
15
|
var RelayReader = require('./RelayReader');
|
|
16
16
|
|
|
@@ -22,10 +22,13 @@ var RelayRecordSourceProxy = require('../mutations/RelayRecordSourceProxy');
|
|
|
22
22
|
|
|
23
23
|
var RelayRecordSourceSelectorProxy = require('../mutations/RelayRecordSourceSelectorProxy');
|
|
24
24
|
|
|
25
|
-
var invariant = require(
|
|
25
|
+
var invariant = require('invariant');
|
|
26
26
|
|
|
27
27
|
var warning = require("fbjs/lib/warning");
|
|
28
28
|
|
|
29
|
+
var applyWithGuard = (_global$ErrorUtils$ap = (_global$ErrorUtils = global.ErrorUtils) === null || _global$ErrorUtils === void 0 ? void 0 : _global$ErrorUtils.applyWithGuard) !== null && _global$ErrorUtils$ap !== void 0 ? _global$ErrorUtils$ap : function (callback, context, args, onError, name) {
|
|
30
|
+
return callback.apply(context, args);
|
|
31
|
+
};
|
|
29
32
|
/**
|
|
30
33
|
* Coordinates the concurrent modification of a `Store` due to optimistic and
|
|
31
34
|
* non-revertable client updates and server payloads:
|
|
@@ -37,6 +40,7 @@ var warning = require("fbjs/lib/warning");
|
|
|
37
40
|
* - Executes handlers for "handle" fields.
|
|
38
41
|
* - Reverts and reapplies pending optimistic updates.
|
|
39
42
|
*/
|
|
43
|
+
|
|
40
44
|
var RelayPublishQueue = /*#__PURE__*/function () {
|
|
41
45
|
// True if the next `run()` should apply the backup and rerun all optimistic
|
|
42
46
|
// updates performing a rebase.
|
|
@@ -259,7 +263,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
|
|
|
259
263
|
var sink = RelayRecordSource.create();
|
|
260
264
|
var mutator = new RelayRecordSourceMutator(_this2._store.getSource(), sink);
|
|
261
265
|
var recordSourceProxy = new RelayRecordSourceProxy(mutator, _this2._getDataID);
|
|
262
|
-
|
|
266
|
+
applyWithGuard(updater, null, [recordSourceProxy], null, 'RelayPublishQueue:commitData');
|
|
263
267
|
invalidatedStore = invalidatedStore || recordSourceProxy.isStoreMarkedForInvalidation();
|
|
264
268
|
var idsMarkedForInvalidation = recordSourceProxy.getIDsMarkedForInvalidation();
|
|
265
269
|
|
|
@@ -288,7 +292,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
|
|
|
288
292
|
var processUpdate = function processUpdate(optimisticUpdate) {
|
|
289
293
|
if (optimisticUpdate.storeUpdater) {
|
|
290
294
|
var storeUpdater = optimisticUpdate.storeUpdater;
|
|
291
|
-
|
|
295
|
+
applyWithGuard(storeUpdater, null, [recordSourceProxy], null, 'RelayPublishQueue:applyUpdates');
|
|
292
296
|
} else {
|
|
293
297
|
var operation = optimisticUpdate.operation,
|
|
294
298
|
payload = optimisticUpdate.payload,
|
|
@@ -304,7 +308,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
|
|
|
304
308
|
}
|
|
305
309
|
|
|
306
310
|
if (updater) {
|
|
307
|
-
|
|
311
|
+
applyWithGuard(updater, null, [recordSourceSelectorProxy, selectorData], null, 'RelayPublishQueue:applyUpdates');
|
|
308
312
|
}
|
|
309
313
|
}
|
|
310
314
|
}; // rerun all updaters in case we are running a rebase
|
package/lib/store/RelayReader.js
CHANGED
|
@@ -10,11 +10,15 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
14
|
+
|
|
15
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
|
+
|
|
13
17
|
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
14
18
|
|
|
15
19
|
var RelayModernRecord = require('./RelayModernRecord');
|
|
16
20
|
|
|
17
|
-
var invariant = require(
|
|
21
|
+
var invariant = require('invariant');
|
|
18
22
|
|
|
19
23
|
var _require = require('../util/RelayConcreteNode'),
|
|
20
24
|
CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
|
|
@@ -27,6 +31,7 @@ var _require = require('../util/RelayConcreteNode'),
|
|
|
27
31
|
LINKED_FIELD = _require.LINKED_FIELD,
|
|
28
32
|
MODULE_IMPORT = _require.MODULE_IMPORT,
|
|
29
33
|
REQUIRED_FIELD = _require.REQUIRED_FIELD,
|
|
34
|
+
RELAY_RESOLVER = _require.RELAY_RESOLVER,
|
|
30
35
|
SCALAR_FIELD = _require.SCALAR_FIELD,
|
|
31
36
|
STREAM = _require.STREAM;
|
|
32
37
|
|
|
@@ -45,8 +50,11 @@ var _require3 = require('./RelayStoreUtils'),
|
|
|
45
50
|
getStorageKey = _require3.getStorageKey,
|
|
46
51
|
getModuleComponentKey = _require3.getModuleComponentKey;
|
|
47
52
|
|
|
48
|
-
var _require4 = require('./
|
|
49
|
-
|
|
53
|
+
var _require4 = require('./ResolverFragments'),
|
|
54
|
+
withResolverContext = _require4.withResolverContext;
|
|
55
|
+
|
|
56
|
+
var _require5 = require('./TypeID'),
|
|
57
|
+
generateTypeID = _require5.generateTypeID;
|
|
50
58
|
|
|
51
59
|
function read(recordSource, selector) {
|
|
52
60
|
var reader = new RelayReader(recordSource, selector);
|
|
@@ -310,6 +318,17 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
310
318
|
break;
|
|
311
319
|
}
|
|
312
320
|
|
|
321
|
+
case RELAY_RESOLVER:
|
|
322
|
+
{
|
|
323
|
+
if (!RelayFeatureFlags.ENABLE_RELAY_RESOLVERS) {
|
|
324
|
+
throw new Error('Relay Resolver fields are not yet supported.');
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
this._readResolverField(selection, record, data);
|
|
328
|
+
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
|
|
313
332
|
case FRAGMENT_SPREAD:
|
|
314
333
|
this._createFragmentPointer(selection, record, data);
|
|
315
334
|
|
|
@@ -321,7 +340,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
321
340
|
break;
|
|
322
341
|
|
|
323
342
|
case INLINE_DATA_FRAGMENT_SPREAD:
|
|
324
|
-
this.
|
|
343
|
+
this._createInlineDataOrResolverFragmentPointer(selection, record, data);
|
|
325
344
|
|
|
326
345
|
break;
|
|
327
346
|
|
|
@@ -388,6 +407,40 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
388
407
|
}
|
|
389
408
|
};
|
|
390
409
|
|
|
410
|
+
_proto._readResolverField = function _readResolverField(selection, record, data) {
|
|
411
|
+
var _this = this;
|
|
412
|
+
|
|
413
|
+
var name = selection.name,
|
|
414
|
+
alias = selection.alias,
|
|
415
|
+
resolverModule = selection.resolverModule,
|
|
416
|
+
fragment = selection.fragment;
|
|
417
|
+
var key = {
|
|
418
|
+
__id: RelayModernRecord.getDataID(record),
|
|
419
|
+
__fragmentOwner: this._owner,
|
|
420
|
+
__fragments: (0, _defineProperty2["default"])({}, fragment.name, {})
|
|
421
|
+
};
|
|
422
|
+
var resolverContext = {
|
|
423
|
+
getDataForResolverFragment: function getDataForResolverFragment(singularReaderSelector) {
|
|
424
|
+
var _resolverFragmentData;
|
|
425
|
+
|
|
426
|
+
var resolverFragmentData = {};
|
|
427
|
+
|
|
428
|
+
_this._createInlineDataOrResolverFragmentPointer(singularReaderSelector.node, record, resolverFragmentData);
|
|
429
|
+
|
|
430
|
+
var answer = (_resolverFragmentData = resolverFragmentData[FRAGMENTS_KEY]) === null || _resolverFragmentData === void 0 ? void 0 : _resolverFragmentData[fragment.name];
|
|
431
|
+
!(typeof answer === 'object' && answer !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected reader data to contain a __fragments property with a property for the fragment named ".concat(fragment.name, ", but it is missing.")) : invariant(false) : void 0;
|
|
432
|
+
return answer;
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
var resolverResult = withResolverContext(resolverContext, function () {
|
|
436
|
+
return (// $FlowFixMe[prop-missing] - resolver module's type signature is a lie
|
|
437
|
+
resolverModule(key)
|
|
438
|
+
);
|
|
439
|
+
});
|
|
440
|
+
data[alias !== null && alias !== void 0 ? alias : name] = resolverResult;
|
|
441
|
+
return resolverResult;
|
|
442
|
+
};
|
|
443
|
+
|
|
391
444
|
_proto._readFlightField = function _readFlightField(field, record, data) {
|
|
392
445
|
var _field$alias;
|
|
393
446
|
|
|
@@ -466,7 +519,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
466
519
|
};
|
|
467
520
|
|
|
468
521
|
_proto._readPluralLink = function _readPluralLink(field, record, data) {
|
|
469
|
-
var
|
|
522
|
+
var _this2 = this;
|
|
470
523
|
|
|
471
524
|
var _field$alias4;
|
|
472
525
|
|
|
@@ -490,7 +543,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
490
543
|
linkedIDs.forEach(function (linkedID, nextIndex) {
|
|
491
544
|
if (linkedID == null) {
|
|
492
545
|
if (linkedID === undefined) {
|
|
493
|
-
|
|
546
|
+
_this2._isMissingData = true;
|
|
494
547
|
} // $FlowFixMe[cannot-write]
|
|
495
548
|
|
|
496
549
|
|
|
@@ -502,7 +555,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
502
555
|
!(prevItem == null || typeof prevItem === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field `%s` on record `%s` ' + 'to be an object, got `%s`.', applicationName, RelayModernRecord.getDataID(record), prevItem) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
|
|
503
556
|
// $FlowFixMe[incompatible-variance]
|
|
504
557
|
|
|
505
|
-
linkedArray[nextIndex] =
|
|
558
|
+
linkedArray[nextIndex] = _this2._traverse(field, linkedID, prevItem);
|
|
506
559
|
});
|
|
507
560
|
data[applicationName] = linkedArray;
|
|
508
561
|
return linkedArray;
|
|
@@ -564,7 +617,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
564
617
|
}
|
|
565
618
|
};
|
|
566
619
|
|
|
567
|
-
_proto.
|
|
620
|
+
_proto._createInlineDataOrResolverFragmentPointer = function _createInlineDataOrResolverFragmentPointer(fragmentSpreadOrFragment, record, data) {
|
|
568
621
|
var fragmentPointers = data[FRAGMENTS_KEY];
|
|
569
622
|
|
|
570
623
|
if (fragmentPointers == null) {
|
|
@@ -579,10 +632,10 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
579
632
|
|
|
580
633
|
var inlineData = {};
|
|
581
634
|
|
|
582
|
-
this._traverseSelections(
|
|
635
|
+
this._traverseSelections(fragmentSpreadOrFragment.selections, record, inlineData); // $FlowFixMe[cannot-write] - writing into read-only field
|
|
583
636
|
|
|
584
637
|
|
|
585
|
-
fragmentPointers[
|
|
638
|
+
fragmentPointers[fragmentSpreadOrFragment.name] = inlineData;
|
|
586
639
|
};
|
|
587
640
|
|
|
588
641
|
return RelayReader;
|
|
@@ -28,7 +28,7 @@ var cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
|
|
|
28
28
|
|
|
29
29
|
var getOperation = require('../util/getOperation');
|
|
30
30
|
|
|
31
|
-
var invariant = require(
|
|
31
|
+
var invariant = require('invariant');
|
|
32
32
|
|
|
33
33
|
var _require = require('./TypeID'),
|
|
34
34
|
generateTypeID = _require.generateTypeID;
|
|
@@ -20,11 +20,9 @@ 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
|
|
|
@@ -447,13 +445,37 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
447
445
|
var fieldValue = data[responseKey];
|
|
448
446
|
|
|
449
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
|
+
|
|
450
471
|
RelayModernRecord.setValue(record, storageKey, null);
|
|
451
472
|
return;
|
|
452
473
|
}
|
|
453
474
|
|
|
454
475
|
var reactFlightPayload = refineToReactFlightPayloadData(fieldValue);
|
|
476
|
+
var reactFlightPayloadDeserializer = this._reactFlightPayloadDeserializer;
|
|
455
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;
|
|
456
|
-
!(typeof
|
|
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;
|
|
457
479
|
|
|
458
480
|
if (reactFlightPayload.errors.length > 0) {
|
|
459
481
|
if (typeof this._reactFlightServerErrorHandler === 'function') {
|
|
@@ -461,22 +483,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
461
483
|
} else {
|
|
462
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;
|
|
463
485
|
}
|
|
464
|
-
}
|
|
465
|
-
// being written. When this occurs, we should not continue normalization of
|
|
466
|
-
// the Flight field because the row response is malformed.
|
|
467
|
-
//
|
|
468
|
-
// Receiving empty rows is OK because it can indicate the start of a stream.
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
if (reactFlightPayload.tree == null) {
|
|
472
|
-
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;
|
|
473
|
-
return;
|
|
474
|
-
} // We store the deserialized reactFlightClientResponse in a separate
|
|
475
|
-
// record and link it to the parent record. This is so we can GC the Flight
|
|
476
|
-
// tree later even if the parent record is still reachable.
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
var reactFlightClientResponse = this._reactFlightPayloadDeserializer(reactFlightPayload.tree);
|
|
486
|
+
}
|
|
480
487
|
|
|
481
488
|
var reactFlightID = generateClientID(RelayModernRecord.getDataID(record), getStorageKey(selection, this._variables));
|
|
482
489
|
|
|
@@ -488,6 +495,25 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
488
495
|
this._recordSource.set(reactFlightID, reactFlightClientResponseRecord);
|
|
489
496
|
}
|
|
490
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);
|
|
491
517
|
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, reactFlightClientResponse);
|
|
492
518
|
var reachableExecutableDefinitions = [];
|
|
493
519
|
|
|
@@ -679,7 +705,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
679
705
|
return RelayResponseNormalizer;
|
|
680
706
|
}();
|
|
681
707
|
|
|
682
|
-
var instrumentedNormalize = RelayProfiler.instrument('RelayResponseNormalizer.normalize', normalize);
|
|
683
708
|
module.exports = {
|
|
684
|
-
normalize:
|
|
709
|
+
normalize: normalize
|
|
685
710
|
};
|
|
@@ -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
|
|
|
@@ -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
|
+
};
|
|
@@ -10,7 +10,7 @@
|
|
|
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('../query/GraphQLTag'),
|
|
16
16
|
getInlineDataFragment = _require.getInlineDataFragment;
|
|
@@ -25,6 +25,9 @@ var _require2 = require('../store/ClientID'),
|
|
|
25
25
|
var _require3 = require('../store/RelayModernOperationDescriptor'),
|
|
26
26
|
createOperationDescriptor = _require3.createOperationDescriptor;
|
|
27
27
|
|
|
28
|
+
var _require4 = require('../store/RelayModernSelector'),
|
|
29
|
+
createReaderSelector = _require4.createReaderSelector;
|
|
30
|
+
|
|
28
31
|
function requestSubscription(environment, config) {
|
|
29
32
|
var subscription = getRequest(config.subscription);
|
|
30
33
|
|
|
@@ -50,19 +53,27 @@ function requestSubscription(environment, config) {
|
|
|
50
53
|
operation: operation,
|
|
51
54
|
updater: updater
|
|
52
55
|
}).map(function (responses) {
|
|
56
|
+
var selector = operation.fragment;
|
|
57
|
+
|
|
53
58
|
if (RelayFeatureFlags.ENABLE_UNIQUE_SUBSCRIPTION_ROOT) {
|
|
59
|
+
var nextID;
|
|
60
|
+
|
|
54
61
|
if (Array.isArray(responses)) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
62
|
+
var _responses$, _responses$$extension;
|
|
63
|
+
|
|
64
|
+
nextID = (_responses$ = responses[0]) === null || _responses$ === void 0 ? void 0 : (_responses$$extension = _responses$.extensions) === null || _responses$$extension === void 0 ? void 0 : _responses$$extension.__relay_subscription_root_id;
|
|
65
|
+
} else {
|
|
66
|
+
var _responses$extensions;
|
|
60
67
|
|
|
68
|
+
nextID = (_responses$extensions = responses.extensions) === null || _responses$extensions === void 0 ? void 0 : _responses$extensions.__relay_subscription_root_id;
|
|
69
|
+
}
|
|
61
70
|
|
|
62
|
-
|
|
71
|
+
if (typeof nextID === 'string') {
|
|
72
|
+
selector = createReaderSelector(selector.node, nextID, selector.variables, selector.owner);
|
|
73
|
+
}
|
|
63
74
|
}
|
|
64
75
|
|
|
65
|
-
var data = environment.lookup(
|
|
76
|
+
var data = environment.lookup(selector).data; // $FlowFixMe[incompatible-cast]
|
|
66
77
|
|
|
67
78
|
return data;
|
|
68
79
|
}).subscribe({
|
|
@@ -17,12 +17,14 @@ var RelayFeatureFlags = {
|
|
|
17
17
|
ENABLE_PRECISE_TYPE_REFINEMENT: false,
|
|
18
18
|
ENABLE_REACT_FLIGHT_COMPONENT_FIELD: false,
|
|
19
19
|
ENABLE_REQUIRED_DIRECTIVES: false,
|
|
20
|
+
ENABLE_RELAY_RESOLVERS: false,
|
|
20
21
|
ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION: false,
|
|
21
22
|
ENABLE_FRIENDLY_QUERY_NAME_GQL_URL: false,
|
|
22
23
|
ENABLE_STORE_SUBSCRIPTIONS_REFACTOR: false,
|
|
23
24
|
ENABLE_LOAD_QUERY_REQUEST_DEDUPING: true,
|
|
24
25
|
ENABLE_DO_NOT_WRAP_LIVE_QUERY: false,
|
|
25
26
|
ENABLE_NOTIFY_SUBSCRIPTION: false,
|
|
26
|
-
ENABLE_UNIQUE_SUBSCRIPTION_ROOT: false
|
|
27
|
+
ENABLE_UNIQUE_SUBSCRIPTION_ROOT: false,
|
|
28
|
+
ENABLE_BATCHED_STORE_UPDATES: false
|
|
27
29
|
};
|
|
28
30
|
module.exports = RelayFeatureFlags;
|