@embrace-io/react-native-tracer-provider
Version:
A React Native for the Embrace SDK that conforms to the OpenTelemetry TracerProvider interface
68 lines (67 loc) • 2.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useEmbraceNativeTracerProvider = void 0;
const react_native_1 = require("react-native");
const react_1 = require("react");
const util_1 = require("./util");
const EmbraceNativeTracerProvider_1 = require("./EmbraceNativeTracerProvider");
/**
* useEmbraceNativeTracerProvider makes sure that the Embrace SDK has been installed and started and
* then sets up a EmbraceNativeTracerProvider
*
* The EmbraceNativeTracerProvider implements a TracerProvider over the native Embrace Android and iOS SDKs.
* Thin wrapped objects representing Tracers and Spans are maintained at the JS level and use Native Modules to
* call down to the SDKs to perform the actual operations on them.
*
* The JS side of its implementation is modelled after [opentelemetry-sdk-trace-base](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-base)
*/
const useEmbraceNativeTracerProvider = (config, enabled = true) => {
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
const [isError, setIsError] = (0, react_1.useState)(false);
const [error, setError] = (0, react_1.useState)("");
const [tracerProvider, setTracerProvider] = (0, react_1.useState)(null);
const [tracer, setTracer] = (0, react_1.useState)(null);
(0, react_1.useEffect)(() => {
if (error) {
(0, util_1.logWarning)(error);
}
}, [error]);
(0, react_1.useEffect)(() => {
if (!enabled) {
return;
}
if (!react_native_1.NativeModules.EmbraceManager) {
setError("You must have the Embrace SDK available to use the TracerProvider, please install `@embrace-io/react-native`.");
setIsError(true);
setIsLoading(false);
return;
}
if (isLoading) {
react_native_1.NativeModules.EmbraceManager.isStarted()
.then((started) => {
if (!started) {
setError("The Embrace SDK must be started to use the TracerProvider, please invoke `initialize` from `@embrace-io/react-native`.");
setIsError(true);
}
else if (!tracerProvider) {
const provider = new EmbraceNativeTracerProvider_1.EmbraceNativeTracerProvider(config);
setTracerProvider(provider);
setTracer(provider.getTracer("embrace-default-tracer"));
}
})
.catch(() => {
setError("Failed to setup EmbraceNativeTracerProvider");
setIsError(true);
})
.finally(() => setIsLoading(false));
}
}, [isLoading, config, enabled, tracerProvider]);
return {
isLoading,
isError,
error,
tracerProvider,
tracer,
};
};
exports.useEmbraceNativeTracerProvider = useEmbraceNativeTracerProvider;