{"version":3,"file":"firestore.js","sources":["../../../../../../../src/integrations/tracing/firebase/otel/patches/firestore.ts"],"sourcesContent":["import * as net from 'node:net';\nimport type { Span, Tracer } from '@opentelemetry/api';\nimport { context, diag, SpanKind, trace } from '@opentelemetry/api';\nimport {\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n isWrapped,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport {\n ATTR_DB_COLLECTION_NAME,\n ATTR_DB_NAMESPACE,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\nimport type { SpanAttributes } from '@sentry/core';\nimport type { FirebaseInstrumentation } from '../firebaseInstrumentation';\nimport type {\n AddDocType,\n CollectionReference,\n DeleteDocType,\n DocumentData,\n DocumentReference,\n FirebaseApp,\n FirebaseInstrumentationConfig,\n FirebaseOptions,\n FirestoreSettings,\n FirestoreSpanCreationHook,\n GetDocsType,\n PartialWithFieldValue,\n QuerySnapshot,\n SetDocType,\n SetOptions,\n WithFieldValue,\n} from '../types';\n\n// Inline minimal types used from `shimmer` to avoid importing shimmer's types directly.\n// We only need the shape for `wrap` and `unwrap` used in this file.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ShimmerWrap = (target: any, name: string, wrapper: (...args: any[]) => any) => void;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ShimmerUnwrap = (target: any, name: string) => void;\n\n/**\n *\n * @param tracer - Opentelemetry Tracer\n * @param firestoreSupportedVersions - supported version of firebase/firestore\n * @param wrap - reference to native instrumentation wrap function\n * @param unwrap - reference to native instrumentation wrap function\n */\nexport function patchFirestore(\n tracer: Tracer,\n firestoreSupportedVersions: string[],\n wrap: ShimmerWrap,\n unwrap: ShimmerUnwrap,\n config: FirebaseInstrumentationConfig,\n): InstrumentationNodeModuleDefinition {\n const defaultFirestoreSpanCreationHook: FirestoreSpanCreationHook = () => {};\n\n let firestoreSpanCreationHook: FirestoreSpanCreationHook = defaultFirestoreSpanCreationHook;\n const configFirestoreSpanCreationHook = config.firestoreSpanCreationHook;\n\n if (typeof configFirestoreSpanCreationHook === 'function') {\n firestoreSpanCreationHook = (span: Span) => {\n safeExecuteInTheMiddle(\n () => configFirestoreSpanCreationHook(span),\n error => {\n if (!error) {\n return;\n }\n diag.error(error?.message);\n },\n true,\n );\n };\n }\n\n const moduleFirestoreCJS = new InstrumentationNodeModuleDefinition(\n '@firebase/firestore',\n firestoreSupportedVersions,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (moduleExports: any) => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),\n );\n const files: string[] = [\n '@firebase/firestore/dist/lite/index.node.cjs.js',\n '@firebase/firestore/dist/lite/index.node.mjs.js',\n '@firebase/firestore/dist/lite/index.rn.esm2017.js',\n '@firebase/firestore/dist/lite/index.cjs.js',\n ];\n\n for (const file of files) {\n moduleFirestoreCJS.files.push(\n new InstrumentationNodeModuleFile(\n file,\n firestoreSupportedVersions,\n moduleExports => wrapMethods(moduleExports, wrap, unwrap, tracer, firestoreSpanCreationHook),\n moduleExports => unwrapMethods(moduleExports, unwrap),\n ),\n );\n }\n\n return moduleFirestoreCJS;\n}\n\nfunction wrapMethods(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports: any,\n wrap: ShimmerWrap,\n unwrap: ShimmerUnwrap,\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n unwrapMethods(moduleExports, unwrap);\n\n wrap(moduleExports, 'addDoc', patchAddDoc(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'getDocs', patchGetDocs(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'setDoc', patchSetDoc(tracer, firestoreSpanCreationHook));\n wrap(moduleExports, 'deleteDoc', patchDeleteDoc(tracer, firestoreSpanCreationHook));\n\n return moduleExports;\n}\n\nfunction unwrapMethods(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n moduleExports: any,\n unwrap: ShimmerUnwrap,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n for (const method of ['addDoc', 'getDocs', 'setDoc', 'deleteDoc']) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isWrapped(moduleExports[method])) {\n unwrap(moduleExports, method);\n }\n }\n return moduleExports;\n}\n\nfunction patchAddDoc(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: AddDocType,\n) => (\n this: FirebaseInstrumentation,\n reference: CollectionReference,\n data: WithFieldValue,\n) => Promise> {\n return function addDoc(original: AddDocType) {\n return function (\n reference: CollectionReference,\n data: WithFieldValue,\n ): Promise> {\n const span = startDBSpan(tracer, 'addDoc', reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan>>(span, () => {\n return original(reference, data);\n });\n };\n };\n}\n\nfunction patchDeleteDoc(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: DeleteDocType,\n) => (this: FirebaseInstrumentation, reference: DocumentReference) => Promise {\n return function deleteDoc(original: DeleteDocType) {\n return function (reference: DocumentReference): Promise {\n const span = startDBSpan(tracer, 'deleteDoc', reference.parent || reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan>(span, () => {\n return original(reference);\n });\n };\n };\n}\n\nfunction patchGetDocs(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: GetDocsType,\n) => (\n this: FirebaseInstrumentation,\n reference: CollectionReference,\n) => Promise> {\n return function getDocs(original: GetDocsType) {\n return function (\n reference: CollectionReference,\n ): Promise> {\n const span = startDBSpan(tracer, 'getDocs', reference);\n firestoreSpanCreationHook(span);\n return executeContextWithSpan>>(span, () => {\n return original(reference);\n });\n };\n };\n}\n\nfunction patchSetDoc(\n tracer: Tracer,\n firestoreSpanCreationHook: FirestoreSpanCreationHook,\n): (\n original: SetDocType,\n) => (\n this: FirebaseInstrumentation,\n reference: DocumentReference,\n data: WithFieldValue & PartialWithFieldValue,\n options?: SetOptions,\n) => Promise {\n return function setDoc(original: SetDocType) {\n return function (\n reference: DocumentReference,\n data: WithFieldValue & PartialWithFieldValue,\n options?: SetOptions,\n ): Promise {\n const span = startDBSpan(tracer, 'setDoc', reference.parent || reference);\n firestoreSpanCreationHook(span);\n\n return executeContextWithSpan>(span, () => {\n return typeof options !== 'undefined' ? original(reference, data, options) : original(reference, data);\n });\n };\n };\n}\n\nfunction executeContextWithSpan(span: Span, callback: () => T): T {\n return context.with(trace.setSpan(context.active(), span), () => {\n return safeExecuteInTheMiddle(\n (): T => {\n return callback();\n },\n err => {\n if (err) {\n span.recordException(err);\n }\n span.end();\n },\n true,\n );\n });\n}\n\nfunction startDBSpan(\n tracer: Tracer,\n spanName: string,\n reference: CollectionReference | DocumentReference,\n): Span {\n const span = tracer.startSpan(`${spanName} ${reference.path}`, { kind: SpanKind.CLIENT });\n addAttributes(span, reference);\n span.setAttribute(ATTR_DB_OPERATION_NAME, spanName);\n return span;\n}\n\n/**\n * Gets the server address and port attributes from the Firestore settings.\n * It's best effort to extract the address and port from the settings, especially for IPv6.\n * @param span - The span to set attributes on.\n * @param settings - The Firestore settings containing host information.\n */\nexport function getPortAndAddress(settings: FirestoreSettings): {\n address?: string;\n port?: number;\n} {\n let address: string | undefined;\n let port: string | undefined;\n\n if (typeof settings.host === 'string') {\n if (settings.host.startsWith('[')) {\n // IPv6 addresses can be enclosed in square brackets, e.g., [2001:db8::1]:8080\n if (settings.host.endsWith(']')) {\n // IPv6 with square brackets without port\n address = settings.host.replace(/^\\[|\\]$/g, '');\n } else if (settings.host.includes(']:')) {\n // IPv6 with square brackets with port\n const lastColonIndex = settings.host.lastIndexOf(':');\n if (lastColonIndex !== -1) {\n address = settings.host.slice(1, lastColonIndex).replace(/^\\[|\\]$/g, '');\n port = settings.host.slice(lastColonIndex + 1);\n }\n }\n } else {\n // IPv4 or IPv6 without square brackets\n // If it's an IPv6 address without square brackets, we assume it does not have a port.\n if (net.isIPv6(settings.host)) {\n address = settings.host;\n }\n // If it's an IPv4 address, we can extract the port if it exists.\n else {\n const lastColonIndex = settings.host.lastIndexOf(':');\n if (lastColonIndex !== -1) {\n address = settings.host.slice(0, lastColonIndex);\n port = settings.host.slice(lastColonIndex + 1);\n } else {\n address = settings.host;\n }\n }\n }\n }\n return {\n address: address,\n port: port ? parseInt(port, 10) : undefined,\n };\n}\n\nfunction addAttributes(\n span: Span,\n reference: CollectionReference | DocumentReference,\n): void {\n const firestoreApp: FirebaseApp = reference.firestore.app;\n const firestoreOptions: FirebaseOptions = firestoreApp.options;\n const json: { settings?: FirestoreSettings } = reference.firestore.toJSON() || {};\n const settings: FirestoreSettings = json.settings || {};\n\n const attributes: SpanAttributes = {\n [ATTR_DB_COLLECTION_NAME]: reference.path,\n [ATTR_DB_NAMESPACE]: firestoreApp.name,\n [ATTR_DB_SYSTEM_NAME]: 'firebase.firestore',\n 'firebase.firestore.type': reference.type,\n 'firebase.firestore.options.projectId': firestoreOptions.projectId,\n 'firebase.firestore.options.appId': firestoreOptions.appId,\n 'firebase.firestore.options.messagingSenderId': firestoreOptions.messagingSenderId,\n 'firebase.firestore.options.storageBucket': firestoreOptions.storageBucket,\n };\n\n const { address, port } = getPortAndAddress(settings);\n\n if (address) {\n attributes[ATTR_SERVER_ADDRESS] = address;\n }\n if (port) {\n attributes[ATTR_SERVER_PORT] = port;\n }\n\n span.setAttributes(attributes);\n}\n"],"names":[],"mappings":"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"}