mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
172 lines
3.6 KiB
JavaScript
172 lines
3.6 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
*/
|
|
|
|
import type {Interaction, Subscriber} from './Tracing';
|
|
|
|
import {enableSchedulerTracing} from 'shared/ReactFeatureFlags';
|
|
import {__subscriberRef} from './Tracing';
|
|
|
|
let subscribers: Set<Subscriber> = (null: any);
|
|
if (enableSchedulerTracing) {
|
|
subscribers = new Set();
|
|
}
|
|
|
|
export function unstable_subscribe(subscriber: Subscriber): void {
|
|
if (enableSchedulerTracing) {
|
|
subscribers.add(subscriber);
|
|
|
|
if (subscribers.size === 1) {
|
|
__subscriberRef.current = {
|
|
onInteractionScheduledWorkCompleted,
|
|
onInteractionTraced,
|
|
onWorkCanceled,
|
|
onWorkScheduled,
|
|
onWorkStarted,
|
|
onWorkStopped,
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
export function unstable_unsubscribe(subscriber: Subscriber): void {
|
|
if (enableSchedulerTracing) {
|
|
subscribers.delete(subscriber);
|
|
|
|
if (subscribers.size === 0) {
|
|
__subscriberRef.current = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
function onInteractionTraced(interaction: Interaction): void {
|
|
let didCatchError = false;
|
|
let caughtError = null;
|
|
|
|
subscribers.forEach(subscriber => {
|
|
try {
|
|
subscriber.onInteractionTraced(interaction);
|
|
} catch (error) {
|
|
if (!didCatchError) {
|
|
didCatchError = true;
|
|
caughtError = error;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (didCatchError) {
|
|
throw caughtError;
|
|
}
|
|
}
|
|
|
|
function onInteractionScheduledWorkCompleted(interaction: Interaction): void {
|
|
let didCatchError = false;
|
|
let caughtError = null;
|
|
|
|
subscribers.forEach(subscriber => {
|
|
try {
|
|
subscriber.onInteractionScheduledWorkCompleted(interaction);
|
|
} catch (error) {
|
|
if (!didCatchError) {
|
|
didCatchError = true;
|
|
caughtError = error;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (didCatchError) {
|
|
throw caughtError;
|
|
}
|
|
}
|
|
|
|
function onWorkScheduled(
|
|
interactions: Set<Interaction>,
|
|
threadID: number,
|
|
): void {
|
|
let didCatchError = false;
|
|
let caughtError = null;
|
|
|
|
subscribers.forEach(subscriber => {
|
|
try {
|
|
subscriber.onWorkScheduled(interactions, threadID);
|
|
} catch (error) {
|
|
if (!didCatchError) {
|
|
didCatchError = true;
|
|
caughtError = error;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (didCatchError) {
|
|
throw caughtError;
|
|
}
|
|
}
|
|
|
|
function onWorkStarted(interactions: Set<Interaction>, threadID: number): void {
|
|
let didCatchError = false;
|
|
let caughtError = null;
|
|
|
|
subscribers.forEach(subscriber => {
|
|
try {
|
|
subscriber.onWorkStarted(interactions, threadID);
|
|
} catch (error) {
|
|
if (!didCatchError) {
|
|
didCatchError = true;
|
|
caughtError = error;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (didCatchError) {
|
|
throw caughtError;
|
|
}
|
|
}
|
|
|
|
function onWorkStopped(interactions: Set<Interaction>, threadID: number): void {
|
|
let didCatchError = false;
|
|
let caughtError = null;
|
|
|
|
subscribers.forEach(subscriber => {
|
|
try {
|
|
subscriber.onWorkStopped(interactions, threadID);
|
|
} catch (error) {
|
|
if (!didCatchError) {
|
|
didCatchError = true;
|
|
caughtError = error;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (didCatchError) {
|
|
throw caughtError;
|
|
}
|
|
}
|
|
|
|
function onWorkCanceled(
|
|
interactions: Set<Interaction>,
|
|
threadID: number,
|
|
): void {
|
|
let didCatchError = false;
|
|
let caughtError = null;
|
|
|
|
subscribers.forEach(subscriber => {
|
|
try {
|
|
subscriber.onWorkCanceled(interactions, threadID);
|
|
} catch (error) {
|
|
if (!didCatchError) {
|
|
didCatchError = true;
|
|
caughtError = error;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (didCatchError) {
|
|
throw caughtError;
|
|
}
|
|
}
|