relay-runtime 9.0.0 → 9.1.0

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.
Files changed (111) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +34 -0
  2. package/handlers/connection/ConnectionHandler.js.flow +549 -0
  3. package/handlers/connection/ConnectionInterface.js.flow +92 -0
  4. package/index.js +1 -1
  5. package/index.js.flow +314 -0
  6. package/lib/handlers/connection/ConnectionHandler.js +1 -3
  7. package/lib/index.js +1 -2
  8. package/lib/mutations/RelayDeclarativeMutationConfig.js +22 -45
  9. package/lib/mutations/RelayRecordProxy.js +1 -3
  10. package/lib/mutations/RelayRecordSourceMutator.js +1 -3
  11. package/lib/mutations/RelayRecordSourceProxy.js +1 -3
  12. package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -3
  13. package/lib/mutations/commitMutation.js +2 -0
  14. package/lib/mutations/validateMutation.js +13 -4
  15. package/lib/network/RelayObservable.js +9 -9
  16. package/lib/network/RelayQueryResponseCache.js +8 -6
  17. package/lib/query/fetchQueryInternal.js +1 -8
  18. package/lib/store/DataChecker.js +23 -51
  19. package/lib/store/RelayConcreteVariables.js +6 -2
  20. package/lib/store/RelayModernEnvironment.js +30 -12
  21. package/lib/store/RelayModernFragmentSpecResolver.js +9 -13
  22. package/lib/store/RelayModernQueryExecutor.js +73 -37
  23. package/lib/store/RelayModernRecord.js +14 -9
  24. package/lib/store/RelayModernStore.js +107 -70
  25. package/lib/store/RelayOperationTracker.js +35 -78
  26. package/lib/store/RelayOptimisticRecordSource.js +7 -5
  27. package/lib/store/RelayPublishQueue.js +1 -3
  28. package/lib/store/RelayReader.js +1 -3
  29. package/lib/store/RelayRecordSource.js +1 -3
  30. package/lib/store/RelayRecordSourceMapImpl.js +13 -18
  31. package/lib/store/RelayReferenceMarker.js +2 -6
  32. package/lib/store/RelayResponseNormalizer.js +9 -10
  33. package/lib/store/StoreInspector.js +7 -5
  34. package/lib/store/normalizeRelayPayload.js +6 -2
  35. package/lib/subscription/requestSubscription.js +4 -2
  36. package/lib/util/RelayFeatureFlags.js +1 -1
  37. package/lib/util/RelayReplaySubject.js +1 -3
  38. package/lib/util/createPayloadFor3DField.js +7 -2
  39. package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
  40. package/mutations/RelayRecordProxy.js.flow +165 -0
  41. package/mutations/RelayRecordSourceMutator.js.flow +238 -0
  42. package/mutations/RelayRecordSourceProxy.js.flow +164 -0
  43. package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
  44. package/mutations/applyOptimisticMutation.js.flow +76 -0
  45. package/mutations/commitLocalUpdate.js.flow +24 -0
  46. package/mutations/commitMutation.js.flow +184 -0
  47. package/mutations/validateMutation.js.flow +211 -0
  48. package/network/ConvertToExecuteFunction.js.flow +49 -0
  49. package/network/RelayNetwork.js.flow +84 -0
  50. package/network/RelayNetworkTypes.js.flow +123 -0
  51. package/network/RelayObservable.js.flow +634 -0
  52. package/network/RelayQueryResponseCache.js.flow +111 -0
  53. package/package.json +1 -1
  54. package/query/GraphQLTag.js.flow +166 -0
  55. package/query/fetchQuery.js.flow +47 -0
  56. package/query/fetchQueryInternal.js.flow +349 -0
  57. package/relay-runtime.js +2 -2
  58. package/relay-runtime.min.js +2 -2
  59. package/store/ClientID.js.flow +43 -0
  60. package/store/DataChecker.js.flow +426 -0
  61. package/store/RelayConcreteVariables.js.flow +96 -0
  62. package/store/RelayModernEnvironment.js.flow +526 -0
  63. package/store/RelayModernFragmentSpecResolver.js.flow +426 -0
  64. package/store/RelayModernOperationDescriptor.js.flow +88 -0
  65. package/store/RelayModernQueryExecutor.js.flow +1327 -0
  66. package/store/RelayModernRecord.js.flow +403 -0
  67. package/store/RelayModernSelector.js.flow +444 -0
  68. package/store/RelayModernStore.js.flow +757 -0
  69. package/store/RelayOperationTracker.js.flow +164 -0
  70. package/store/RelayOptimisticRecordSource.js.flow +119 -0
  71. package/store/RelayPublishQueue.js.flow +401 -0
  72. package/store/RelayReader.js.flow +376 -0
  73. package/store/RelayRecordSource.js.flow +29 -0
  74. package/store/RelayRecordSourceMapImpl.js.flow +87 -0
  75. package/store/RelayRecordState.js.flow +37 -0
  76. package/store/RelayReferenceMarker.js.flow +236 -0
  77. package/store/RelayResponseNormalizer.js.flow +556 -0
  78. package/store/RelayStoreTypes.js.flow +873 -0
  79. package/store/RelayStoreUtils.js.flow +218 -0
  80. package/store/StoreInspector.js.flow +173 -0
  81. package/store/ViewerPattern.js.flow +26 -0
  82. package/store/cloneRelayHandleSourceField.js.flow +66 -0
  83. package/store/createFragmentSpecResolver.js.flow +55 -0
  84. package/store/createRelayContext.js.flow +44 -0
  85. package/store/defaultGetDataID.js.flow +27 -0
  86. package/store/hasOverlappingIDs.js.flow +34 -0
  87. package/store/isRelayModernEnvironment.js.flow +27 -0
  88. package/store/normalizeRelayPayload.js.flow +51 -0
  89. package/store/readInlineData.js.flow +75 -0
  90. package/subscription/requestSubscription.js.flow +100 -0
  91. package/util/JSResourceTypes.flow.js.flow +20 -0
  92. package/util/NormalizationNode.js.flow +191 -0
  93. package/util/ReaderNode.js.flow +208 -0
  94. package/util/RelayConcreteNode.js.flow +80 -0
  95. package/util/RelayDefaultHandleKey.js.flow +17 -0
  96. package/util/RelayError.js.flow +33 -0
  97. package/util/RelayFeatureFlags.js.flow +30 -0
  98. package/util/RelayProfiler.js.flow +284 -0
  99. package/util/RelayReplaySubject.js.flow +134 -0
  100. package/util/RelayRuntimeTypes.js.flow +70 -0
  101. package/util/createPayloadFor3DField.js.flow +43 -0
  102. package/util/deepFreeze.js.flow +36 -0
  103. package/util/generateID.js.flow +21 -0
  104. package/util/getFragmentIdentifier.js.flow +52 -0
  105. package/util/getRelayHandleKey.js.flow +41 -0
  106. package/util/getRequestIdentifier.js.flow +41 -0
  107. package/util/isPromise.js.flow +21 -0
  108. package/util/isScalarAndEqual.js.flow +26 -0
  109. package/util/recycleNodesInto.js.flow +80 -0
  110. package/util/resolveImmediate.js.flow +30 -0
  111. package/util/stableCopy.js.flow +35 -0
@@ -0,0 +1,526 @@
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
+ * @flow
8
+ * @emails oncall+relay
9
+ * @format
10
+ */
11
+
12
+ // flowlint ambiguous-object-type:error
13
+
14
+ 'use strict';
15
+
16
+ const RelayDefaultHandlerProvider = require('../handlers/RelayDefaultHandlerProvider');
17
+ const RelayFeatureFlags = require('../util/RelayFeatureFlags');
18
+ const RelayModernQueryExecutor = require('./RelayModernQueryExecutor');
19
+ const RelayObservable = require('../network/RelayObservable');
20
+ const RelayOperationTracker = require('../store/RelayOperationTracker');
21
+ const RelayPublishQueue = require('./RelayPublishQueue');
22
+ const RelayRecordSource = require('./RelayRecordSource');
23
+
24
+ const defaultGetDataID = require('./defaultGetDataID');
25
+ const generateID = require('../util/generateID');
26
+ const invariant = require('invariant');
27
+
28
+ import type {HandlerProvider} from '../handlers/RelayDefaultHandlerProvider';
29
+ import type {
30
+ GraphQLResponse,
31
+ INetwork,
32
+ LogRequestInfoFunction,
33
+ PayloadData,
34
+ UploadableMap,
35
+ } from '../network/RelayNetworkTypes';
36
+ import type {Observer} from '../network/RelayObservable';
37
+ import type {RequestParameters} from '../util/RelayConcreteNode';
38
+ import type {
39
+ CacheConfig,
40
+ Disposable,
41
+ RenderPolicy,
42
+ Variables,
43
+ } from '../util/RelayRuntimeTypes';
44
+ import type {ActiveState} from './RelayModernQueryExecutor';
45
+ import type {TaskScheduler} from './RelayModernQueryExecutor';
46
+ import type {GetDataID} from './RelayResponseNormalizer';
47
+ import type {
48
+ IEnvironment,
49
+ LogFunction,
50
+ MissingFieldHandler,
51
+ OperationAvailability,
52
+ OperationDescriptor,
53
+ OperationLoader,
54
+ OperationTracker,
55
+ OptimisticResponseConfig,
56
+ OptimisticUpdateFunction,
57
+ PublishQueue,
58
+ SelectorStoreUpdater,
59
+ SingularReaderSelector,
60
+ Snapshot,
61
+ Store,
62
+ StoreUpdater,
63
+ } from './RelayStoreTypes';
64
+
65
+ export type EnvironmentConfig = {|
66
+ +configName?: string,
67
+ +handlerProvider?: ?HandlerProvider,
68
+ +treatMissingFieldsAsNull?: boolean,
69
+ +log?: ?LogFunction,
70
+ +operationLoader?: ?OperationLoader,
71
+ +network: INetwork,
72
+ +scheduler?: ?TaskScheduler,
73
+ +store: Store,
74
+ +missingFieldHandlers?: ?$ReadOnlyArray<MissingFieldHandler>,
75
+ +operationTracker?: ?OperationTracker,
76
+ /**
77
+ * This method is likely to change in future versions, use at your own risk.
78
+ * It can potentially break existing calls like store.get(<id>),
79
+ * because the internal ID might not be the `id` field on the node anymore
80
+ */
81
+ +UNSTABLE_DO_NOT_USE_getDataID?: ?GetDataID,
82
+ +UNSTABLE_defaultRenderPolicy?: ?RenderPolicy,
83
+ +options?: mixed,
84
+ +isServer?: boolean,
85
+ |};
86
+
87
+ class RelayModernEnvironment implements IEnvironment {
88
+ __log: LogFunction;
89
+ +_defaultRenderPolicy: RenderPolicy;
90
+ _operationLoader: ?OperationLoader;
91
+ _network: INetwork;
92
+ _publishQueue: PublishQueue;
93
+ _scheduler: ?TaskScheduler;
94
+ _store: Store;
95
+ configName: ?string;
96
+ _missingFieldHandlers: ?$ReadOnlyArray<MissingFieldHandler>;
97
+ _operationTracker: OperationTracker;
98
+ _getDataID: GetDataID;
99
+ _treatMissingFieldsAsNull: boolean;
100
+ _operationExecutions: Map<string, ActiveState>;
101
+ +options: mixed;
102
+ +_isServer: boolean;
103
+
104
+ constructor(config: EnvironmentConfig) {
105
+ this.configName = config.configName;
106
+ const handlerProvider = config.handlerProvider
107
+ ? config.handlerProvider
108
+ : RelayDefaultHandlerProvider;
109
+ this._treatMissingFieldsAsNull = config.treatMissingFieldsAsNull === true;
110
+ const operationLoader = config.operationLoader;
111
+ if (__DEV__) {
112
+ if (operationLoader != null) {
113
+ invariant(
114
+ typeof operationLoader === 'object' &&
115
+ typeof operationLoader.get === 'function' &&
116
+ typeof operationLoader.load === 'function',
117
+ 'RelayModernEnvironment: Expected `operationLoader` to be an object ' +
118
+ 'with get() and load() functions, got `%s`.',
119
+ operationLoader,
120
+ );
121
+ }
122
+ }
123
+ this.__log = config.log ?? emptyFunction;
124
+ this._defaultRenderPolicy =
125
+ config.UNSTABLE_defaultRenderPolicy ??
126
+ RelayFeatureFlags.ENABLE_PARTIAL_RENDERING_DEFAULT === true
127
+ ? 'partial'
128
+ : 'full';
129
+ this._operationLoader = operationLoader;
130
+ this._operationExecutions = new Map();
131
+ this._network = config.network;
132
+ this._getDataID = config.UNSTABLE_DO_NOT_USE_getDataID ?? defaultGetDataID;
133
+ this._publishQueue = new RelayPublishQueue(
134
+ config.store,
135
+ handlerProvider,
136
+ this._getDataID,
137
+ );
138
+ this._scheduler = config.scheduler ?? null;
139
+ this._store = config.store;
140
+ this.options = config.options;
141
+ this._isServer = config.isServer ?? false;
142
+
143
+ (this: any).__setNet = newNet => (this._network = newNet);
144
+
145
+ if (__DEV__) {
146
+ const {inspect} = require('./StoreInspector');
147
+ (this: any).DEBUG_inspect = (dataID: ?string) => inspect(this, dataID);
148
+ }
149
+
150
+ // Register this Relay Environment with Relay DevTools if it exists.
151
+ // Note: this must always be the last step in the constructor.
152
+ const _global =
153
+ typeof global !== 'undefined'
154
+ ? global
155
+ : typeof window !== 'undefined'
156
+ ? window
157
+ : undefined;
158
+ const devToolsHook = _global && _global.__RELAY_DEVTOOLS_HOOK__;
159
+ if (devToolsHook) {
160
+ devToolsHook.registerEnvironment(this);
161
+ }
162
+ this._missingFieldHandlers = config.missingFieldHandlers;
163
+ this._operationTracker =
164
+ config.operationTracker ?? new RelayOperationTracker();
165
+ }
166
+
167
+ getStore(): Store {
168
+ return this._store;
169
+ }
170
+
171
+ getNetwork(): INetwork {
172
+ return this._network;
173
+ }
174
+
175
+ getOperationTracker(): RelayOperationTracker {
176
+ return this._operationTracker;
177
+ }
178
+
179
+ isRequestActive(requestIdentifier: string): boolean {
180
+ const activeState = this._operationExecutions.get(requestIdentifier);
181
+ return activeState === 'active';
182
+ }
183
+
184
+ UNSTABLE_getDefaultRenderPolicy(): RenderPolicy {
185
+ return this._defaultRenderPolicy;
186
+ }
187
+
188
+ applyUpdate(optimisticUpdate: OptimisticUpdateFunction): Disposable {
189
+ const dispose = () => {
190
+ this._publishQueue.revertUpdate(optimisticUpdate);
191
+ this._publishQueue.run();
192
+ };
193
+ this._publishQueue.applyUpdate(optimisticUpdate);
194
+ this._publishQueue.run();
195
+ return {dispose};
196
+ }
197
+
198
+ revertUpdate(update: OptimisticUpdateFunction): void {
199
+ this._publishQueue.revertUpdate(update);
200
+ this._publishQueue.run();
201
+ }
202
+
203
+ replaceUpdate(
204
+ update: OptimisticUpdateFunction,
205
+ newUpdate: OptimisticUpdateFunction,
206
+ ): void {
207
+ this._publishQueue.revertUpdate(update);
208
+ this._publishQueue.applyUpdate(newUpdate);
209
+ this._publishQueue.run();
210
+ }
211
+
212
+ applyMutation(optimisticConfig: OptimisticResponseConfig): Disposable {
213
+ const subscription = RelayObservable.create(sink => {
214
+ const source = RelayObservable.create(_sink => {});
215
+ const executor = RelayModernQueryExecutor.execute({
216
+ operation: optimisticConfig.operation,
217
+ operationExecutions: this._operationExecutions,
218
+ operationLoader: this._operationLoader,
219
+ optimisticConfig,
220
+ publishQueue: this._publishQueue,
221
+ scheduler: this._scheduler,
222
+ sink,
223
+ source,
224
+ store: this._store,
225
+ updater: null,
226
+ operationTracker: this._operationTracker,
227
+ getDataID: this._getDataID,
228
+ treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
229
+ });
230
+ return () => executor.cancel();
231
+ }).subscribe({});
232
+ return {
233
+ dispose: () => subscription.unsubscribe(),
234
+ };
235
+ }
236
+
237
+ check(operation: OperationDescriptor): OperationAvailability {
238
+ if (
239
+ this._missingFieldHandlers == null ||
240
+ this._missingFieldHandlers.length === 0
241
+ ) {
242
+ return this._store.check(operation);
243
+ }
244
+ return this._checkSelectorAndHandleMissingFields(
245
+ operation,
246
+ this._missingFieldHandlers,
247
+ );
248
+ }
249
+
250
+ commitPayload(operation: OperationDescriptor, payload: PayloadData): void {
251
+ RelayObservable.create(sink => {
252
+ const executor = RelayModernQueryExecutor.execute({
253
+ operation: operation,
254
+ operationExecutions: this._operationExecutions,
255
+ operationLoader: this._operationLoader,
256
+ optimisticConfig: null,
257
+ publishQueue: this._publishQueue,
258
+ scheduler: null, // make sure the first payload is sync
259
+ sink,
260
+ source: RelayObservable.from({
261
+ data: payload,
262
+ }),
263
+ store: this._store,
264
+ updater: null,
265
+ operationTracker: this._operationTracker,
266
+ getDataID: this._getDataID,
267
+ isClientPayload: true,
268
+ treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
269
+ });
270
+ return () => executor.cancel();
271
+ }).subscribe({});
272
+ }
273
+
274
+ commitUpdate(updater: StoreUpdater): void {
275
+ this._publishQueue.commitUpdate(updater);
276
+ this._publishQueue.run();
277
+ }
278
+
279
+ lookup(readSelector: SingularReaderSelector): Snapshot {
280
+ return this._store.lookup(readSelector);
281
+ }
282
+
283
+ subscribe(
284
+ snapshot: Snapshot,
285
+ callback: (snapshot: Snapshot) => void,
286
+ ): Disposable {
287
+ return this._store.subscribe(snapshot, callback);
288
+ }
289
+
290
+ retain(operation: OperationDescriptor): Disposable {
291
+ return this._store.retain(operation);
292
+ }
293
+
294
+ isServer(): boolean {
295
+ return this._isServer;
296
+ }
297
+
298
+ _checkSelectorAndHandleMissingFields(
299
+ operation: OperationDescriptor,
300
+ handlers: $ReadOnlyArray<MissingFieldHandler>,
301
+ ): OperationAvailability {
302
+ const target = RelayRecordSource.create();
303
+ const result = this._store.check(operation, {target, handlers});
304
+ if (target.size() > 0) {
305
+ this._publishQueue.commitSource(target);
306
+ this._publishQueue.run();
307
+ }
308
+ return result;
309
+ }
310
+
311
+ /**
312
+ * Returns an Observable of GraphQLResponse resulting from executing the
313
+ * provided Query or Subscription operation, each result of which is then
314
+ * normalized and committed to the publish queue.
315
+ *
316
+ * Note: Observables are lazy, so calling this method will do nothing until
317
+ * the result is subscribed to: environment.execute({...}).subscribe({...}).
318
+ */
319
+ execute({
320
+ operation,
321
+ cacheConfig,
322
+ updater,
323
+ }: {
324
+ operation: OperationDescriptor,
325
+ cacheConfig?: ?CacheConfig,
326
+ updater?: ?SelectorStoreUpdater,
327
+ ...
328
+ }): RelayObservable<GraphQLResponse> {
329
+ const [logObserver, logRequestInfo] = this.__createLogObserver(
330
+ operation.request.node.params,
331
+ operation.request.variables,
332
+ );
333
+ return RelayObservable.create(sink => {
334
+ const source = this._network.execute(
335
+ operation.request.node.params,
336
+ operation.request.variables,
337
+ cacheConfig || {},
338
+ null,
339
+ logRequestInfo,
340
+ );
341
+ const executor = RelayModernQueryExecutor.execute({
342
+ operation,
343
+ operationExecutions: this._operationExecutions,
344
+ operationLoader: this._operationLoader,
345
+ optimisticConfig: null,
346
+ publishQueue: this._publishQueue,
347
+ scheduler: this._scheduler,
348
+ sink,
349
+ source,
350
+ store: this._store,
351
+ updater,
352
+ operationTracker: this._operationTracker,
353
+ getDataID: this._getDataID,
354
+ treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
355
+ });
356
+ return () => executor.cancel();
357
+ }).do(logObserver);
358
+ }
359
+
360
+ /**
361
+ * Returns an Observable of GraphQLResponse resulting from executing the
362
+ * provided Mutation operation, the result of which is then normalized and
363
+ * committed to the publish queue along with an optional optimistic response
364
+ * or updater.
365
+ *
366
+ * Note: Observables are lazy, so calling this method will do nothing until
367
+ * the result is subscribed to:
368
+ * environment.executeMutation({...}).subscribe({...}).
369
+ */
370
+ executeMutation({
371
+ cacheConfig,
372
+ operation,
373
+ optimisticResponse,
374
+ optimisticUpdater,
375
+ updater,
376
+ uploadables,
377
+ }: {|
378
+ cacheConfig?: ?CacheConfig,
379
+ operation: OperationDescriptor,
380
+ optimisticUpdater?: ?SelectorStoreUpdater,
381
+ optimisticResponse?: ?Object,
382
+ updater?: ?SelectorStoreUpdater,
383
+ uploadables?: ?UploadableMap,
384
+ |}): RelayObservable<GraphQLResponse> {
385
+ const [logObserver, logRequestInfo] = this.__createLogObserver(
386
+ operation.request.node.params,
387
+ operation.request.variables,
388
+ );
389
+ return RelayObservable.create(sink => {
390
+ let optimisticConfig;
391
+ if (optimisticResponse || optimisticUpdater) {
392
+ optimisticConfig = {
393
+ operation: operation,
394
+ response: optimisticResponse,
395
+ updater: optimisticUpdater,
396
+ };
397
+ }
398
+ const source = this._network.execute(
399
+ operation.request.node.params,
400
+ operation.request.variables,
401
+ {
402
+ ...cacheConfig,
403
+ force: true,
404
+ },
405
+ uploadables,
406
+ logRequestInfo,
407
+ );
408
+ const executor = RelayModernQueryExecutor.execute({
409
+ operation,
410
+ operationExecutions: this._operationExecutions,
411
+ operationLoader: this._operationLoader,
412
+ optimisticConfig,
413
+ publishQueue: this._publishQueue,
414
+ scheduler: this._scheduler,
415
+ sink,
416
+ source,
417
+ store: this._store,
418
+ updater,
419
+ operationTracker: this._operationTracker,
420
+ getDataID: this._getDataID,
421
+ treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
422
+ });
423
+ return () => executor.cancel();
424
+ }).do(logObserver);
425
+ }
426
+
427
+ /**
428
+ * Returns an Observable of GraphQLResponse resulting from executing the
429
+ * provided Query or Subscription operation responses, the result of which is
430
+ * then normalized and comitted to the publish queue.
431
+ *
432
+ * Note: Observables are lazy, so calling this method will do nothing until
433
+ * the result is subscribed to:
434
+ * environment.executeWithSource({...}).subscribe({...}).
435
+ */
436
+ executeWithSource({
437
+ operation,
438
+ source,
439
+ }: {|
440
+ operation: OperationDescriptor,
441
+ source: RelayObservable<GraphQLResponse>,
442
+ |}): RelayObservable<GraphQLResponse> {
443
+ return RelayObservable.create(sink => {
444
+ const executor = RelayModernQueryExecutor.execute({
445
+ operation,
446
+ operationExecutions: this._operationExecutions,
447
+ operationLoader: this._operationLoader,
448
+ operationTracker: this._operationTracker,
449
+ optimisticConfig: null,
450
+ publishQueue: this._publishQueue,
451
+ scheduler: this._scheduler,
452
+ sink,
453
+ source,
454
+ store: this._store,
455
+ getDataID: this._getDataID,
456
+ treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
457
+ });
458
+ return () => executor.cancel();
459
+ });
460
+ }
461
+
462
+ toJSON(): mixed {
463
+ return `RelayModernEnvironment(${this.configName ?? ''})`;
464
+ }
465
+
466
+ __createLogObserver(
467
+ params: RequestParameters,
468
+ variables: Variables,
469
+ ): [Observer<GraphQLResponse>, LogRequestInfoFunction] {
470
+ const transactionID = generateID();
471
+ const log = this.__log;
472
+ const logObserver = {
473
+ start: subscription => {
474
+ log({
475
+ name: 'execute.start',
476
+ transactionID,
477
+ params,
478
+ variables,
479
+ });
480
+ },
481
+ next: response => {
482
+ log({
483
+ name: 'execute.next',
484
+ transactionID,
485
+ response,
486
+ });
487
+ },
488
+ error: error => {
489
+ log({
490
+ name: 'execute.error',
491
+ transactionID,
492
+ error,
493
+ });
494
+ },
495
+ complete: () => {
496
+ log({
497
+ name: 'execute.complete',
498
+ transactionID,
499
+ });
500
+ },
501
+ unsubscribe: () => {
502
+ log({
503
+ name: 'execute.unsubscribe',
504
+ transactionID,
505
+ });
506
+ },
507
+ };
508
+ const logRequestInfo = info => {
509
+ log({
510
+ name: 'execute.info',
511
+ transactionID,
512
+ info,
513
+ });
514
+ };
515
+ return [logObserver, logRequestInfo];
516
+ }
517
+ }
518
+
519
+ // Add a sigil for detection by `isRelayModernEnvironment()` to avoid a
520
+ // realm-specific instanceof check, and to aid in module tree-shaking to
521
+ // avoid requiring all of RelayRuntime just to detect its environment.
522
+ (RelayModernEnvironment: any).prototype['@@RelayModernEnvironment'] = true;
523
+
524
+ function emptyFunction() {}
525
+
526
+ module.exports = RelayModernEnvironment;