@sentio/sdk-bundle 2.44.0 → 2.44.1-rc.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/lib/aptos/builtin/0x1.js +1 -1
- package/lib/aptos/builtin/0x3.js +1 -1
- package/lib/aptos/builtin/index.js +1 -1
- package/lib/aptos/ext/index.js +1 -1
- package/lib/aptos/index.js +1 -1
- package/lib/chunk-F6O7Z5YC.js +6 -0
- package/lib/chunk-F6O7Z5YC.js.map +1 -0
- package/lib/{chunk-QTRTXIKL.js → chunk-FAZ3MF2Y.js} +2 -2
- package/lib/{chunk-TVLODLMF.js → chunk-KJU5FRRJ.js} +2 -2
- package/lib/chunk-LN5QJQIM.js +5 -0
- package/lib/chunk-LN5QJQIM.js.map +1 -0
- package/lib/{chunk-43AULYHS.js → chunk-NCOPZM3S.js} +2 -2
- package/lib/chunk-TTZSFKIM.js +16 -0
- package/lib/chunk-TTZSFKIM.js.map +1 -0
- package/lib/{chunk-HRWNB6TA.js → chunk-UNDTHQXJ.js} +2 -2
- package/lib/{chunk-FOPG6CCD.js → chunk-VQRG4IVB.js} +2 -2
- package/lib/{chunk-GJZNIDSI.js → chunk-Y5C3UST2.js} +2 -2
- package/lib/fuel/fuel-plugin.d.ts.map +1 -1
- package/lib/fuel/index.js +1 -1
- package/lib/solana/builtin/types.d.ts +4 -4
- package/lib/sui/builtin/0x1.js +1 -1
- package/lib/sui/builtin/0x2.js +1 -1
- package/lib/sui/builtin/0x3.js +1 -1
- package/lib/sui/builtin/index.js +1 -1
- package/lib/sui/ext/index.js +1 -1
- package/lib/sui/index.js +1 -1
- package/lib/testing/index.js +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/utils/price.d.ts +4 -338
- package/lib/utils/price.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/fuel/fuel-plugin.ts +9 -2
- package/src/utils/price.ts +19 -27
- package/lib/chunk-GELZJPWE.js +0 -6
- package/lib/chunk-GELZJPWE.js.map +0 -1
- package/lib/chunk-RFCXI7MC.js +0 -16
- package/lib/chunk-RFCXI7MC.js.map +0 -1
- package/lib/chunk-Y5DGYRRN.js +0 -5
- package/lib/chunk-Y5DGYRRN.js.map +0 -1
- /package/lib/{chunk-QTRTXIKL.js.map → chunk-FAZ3MF2Y.js.map} +0 -0
- /package/lib/{chunk-TVLODLMF.js.map → chunk-KJU5FRRJ.js.map} +0 -0
- /package/lib/{chunk-43AULYHS.js.map → chunk-NCOPZM3S.js.map} +0 -0
- /package/lib/{chunk-HRWNB6TA.js.map → chunk-UNDTHQXJ.js.map} +0 -0
- /package/lib/{chunk-FOPG6CCD.js.map → chunk-VQRG4IVB.js.map} +0 -0
- /package/lib/{chunk-GJZNIDSI.js.map → chunk-Y5C3UST2.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/util.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/registry.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/validation.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metric.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/exemplar.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/counter.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/gauge.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/histogram.js","../../../node_modules/.pnpm/bintrees@1.0.2/node_modules/bintrees/lib/treebase.js","../../../node_modules/.pnpm/bintrees@1.0.2/node_modules/bintrees/lib/rbtree.js","../../../node_modules/.pnpm/bintrees@1.0.2/node_modules/bintrees/lib/bintree.js","../../../node_modules/.pnpm/bintrees@1.0.2/node_modules/bintrees/index.js","../../../node_modules/.pnpm/tdigest@0.1.2/node_modules/tdigest/tdigest.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/timeWindowQuantiles.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/summary.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/pushgateway.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/bucketGenerators.js","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/platform/node/globalThis.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/platform/node/index.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/platform/index.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/version.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/internal/semver.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/internal/global-utils.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/diag/ComponentLogger.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/diag/types.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/diag/internal/logLevelLogger.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/api/diag.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/baggage/internal/baggage-impl.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/baggage/internal/symbol.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/baggage/utils.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/context/context.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/diag/consoleLogger.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/metrics/NoopMeter.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/metrics/Metric.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/propagation/TextMapPropagator.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/context/NoopContextManager.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/api/context.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/trace_flags.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/invalid-span-constants.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/NonRecordingSpan.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/context-utils.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/spancontext-utils.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/NoopTracer.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/ProxyTracer.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/NoopTracerProvider.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/ProxyTracerProvider.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/SamplingResult.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/span_kind.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/status.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/internal/tracestate-validators.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/internal/tracestate-impl.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace/internal/utils.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/context-api.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/diag-api.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/metrics/NoopMeterProvider.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/api/metrics.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/metrics-api.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/propagation/NoopTextMapPropagator.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/baggage/context-helpers.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/api/propagation.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/propagation-api.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/api/trace.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/trace-api.ts","../../../node_modules/.pnpm/@opentelemetry+api@1.9.0/node_modules/@opentelemetry/api/src/index.ts","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/processCpuTotal.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/processStartTime.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/osMemoryHeapLinux.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/helpers/safeMemoryUsage.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/osMemoryHeap.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/processOpenFileDescriptors.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/processMaxFileDescriptors.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/eventLoopLag.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/helpers/processMetricsHelpers.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/processHandles.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/processRequests.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/processResources.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/heapSizeAndUsed.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/heapSpacesSizeAndUsed.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/version.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metrics/gc.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/defaultMetrics.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/metricAggregators.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/lib/cluster.js","../../../node_modules/.pnpm/prom-client@15.1.2/node_modules/prom-client/index.js","../../../node_modules/.pnpm/nice-grpc-prometheus@0.2.4/node_modules/nice-grpc-prometheus/src/registry.ts","../../../node_modules/.pnpm/nice-grpc-prometheus@0.2.4/node_modules/nice-grpc-prometheus/src/common.ts","../../../node_modules/.pnpm/nice-grpc-prometheus@0.2.4/node_modules/nice-grpc-prometheus/src/server.ts","../../../node_modules/.pnpm/nice-grpc-prometheus@0.2.4/node_modules/nice-grpc-prometheus/src/client.ts","../../../node_modules/.pnpm/nice-grpc-prometheus@0.2.4/node_modules/nice-grpc-prometheus/src/index.ts","../../../node_modules/.pnpm/nice-grpc-client-middleware-retry@3.1.8/node_modules/nice-grpc-client-middleware-retry/src/index.ts","../src/utils/block.ts","../src/utils/conversion.ts","../src/utils/token.ts","../../../node_modules/.pnpm/lru-cache@11.0.0/node_modules/lru-cache/src/index.ts","../src/utils/dex-price.ts","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/CsvError.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/utils/is_object.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/normalize_columns_array.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/utils/ResizeableBuffer.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/init_state.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/utils/underscore.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/normalize_options.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/index.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/sync.js","../../protos/src/service/price/protos/price.ts","../src/utils/price.ts","../src/utils/call.ts","../src/utils/index.ts"],"sourcesContent":["'use strict';\n\nexports.getValueAsString = function getValueString(value) {\n\tif (Number.isNaN(value)) {\n\t\treturn 'Nan';\n\t} else if (!Number.isFinite(value)) {\n\t\tif (value < 0) {\n\t\t\treturn '-Inf';\n\t\t} else {\n\t\t\treturn '+Inf';\n\t\t}\n\t} else {\n\t\treturn `${value}`;\n\t}\n};\n\nexports.removeLabels = function removeLabels(\n\thashMap,\n\tlabels,\n\tsortedLabelNames,\n) {\n\tconst hash = hashObject(labels, sortedLabelNames);\n\tdelete hashMap[hash];\n};\n\nexports.setValue = function setValue(hashMap, value, labels) {\n\tconst hash = hashObject(labels);\n\thashMap[hash] = {\n\t\tvalue: typeof value === 'number' ? value : 0,\n\t\tlabels: labels || {},\n\t};\n\treturn hashMap;\n};\n\nexports.setValueDelta = function setValueDelta(\n\thashMap,\n\tdeltaValue,\n\tlabels,\n\thash = '',\n) {\n\tconst value = typeof deltaValue === 'number' ? deltaValue : 0;\n\tif (hashMap[hash]) {\n\t\thashMap[hash].value += value;\n\t} else {\n\t\thashMap[hash] = { value, labels };\n\t}\n\treturn hashMap;\n};\n\nexports.getLabels = function (labelNames, args) {\n\tif (typeof args[0] === 'object') {\n\t\treturn args[0];\n\t}\n\n\tif (labelNames.length !== args.length) {\n\t\tthrow new Error('Invalid number of arguments');\n\t}\n\n\tconst acc = {};\n\tfor (let i = 0; i < labelNames.length; i++) {\n\t\tacc[labelNames[i]] = args[i];\n\t}\n\treturn acc;\n};\n\nfunction fastHashObject(keys, labels) {\n\tif (keys.length === 0) {\n\t\treturn '';\n\t}\n\n\tlet hash = '';\n\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tconst value = labels[key];\n\t\tif (value === undefined) continue;\n\n\t\thash += `${key}:${value},`;\n\t}\n\n\treturn hash;\n}\n\nfunction hashObject(labels, labelNames) {\n\t// We don't actually need a hash here. We just need a string that\n\t// is unique for each possible labels object and consistent across\n\t// calls with equivalent labels objects.\n\n\tif (labelNames) {\n\t\treturn fastHashObject(labelNames, labels);\n\t}\n\n\tconst keys = Object.keys(labels);\n\tif (keys.length > 1) {\n\t\tkeys.sort(); // need consistency across calls\n\t}\n\n\treturn fastHashObject(keys, labels);\n}\nexports.hashObject = hashObject;\n\nexports.isObject = function isObject(obj) {\n\treturn obj !== null && typeof obj === 'object';\n};\n\nexports.nowTimestamp = function nowTimestamp() {\n\treturn Date.now() / 1000;\n};\n\nclass Grouper extends Map {\n\t/**\n\t * Adds the `value` to the `key`'s array of values.\n\t * @param {*} key Key to set.\n\t * @param {*} value Value to add to `key`'s array.\n\t * @returns {undefined} undefined.\n\t */\n\tadd(key, value) {\n\t\tif (this.has(key)) {\n\t\t\tthis.get(key).push(value);\n\t\t} else {\n\t\t\tthis.set(key, [value]);\n\t\t}\n\t}\n}\n\nexports.Grouper = Grouper;\n","'use strict';\n\nconst { getValueAsString } = require('./util');\n\nclass Registry {\n\tstatic get PROMETHEUS_CONTENT_TYPE() {\n\t\treturn 'text/plain; version=0.0.4; charset=utf-8';\n\t}\n\n\tstatic get OPENMETRICS_CONTENT_TYPE() {\n\t\treturn 'application/openmetrics-text; version=1.0.0; charset=utf-8';\n\t}\n\n\tconstructor(regContentType = Registry.PROMETHEUS_CONTENT_TYPE) {\n\t\tthis._metrics = {};\n\t\tthis._collectors = [];\n\t\tthis._defaultLabels = {};\n\t\tif (\n\t\t\tregContentType !== Registry.PROMETHEUS_CONTENT_TYPE &&\n\t\t\tregContentType !== Registry.OPENMETRICS_CONTENT_TYPE\n\t\t) {\n\t\t\tthrow new TypeError(`Content type ${regContentType} is unsupported`);\n\t\t}\n\t\tthis._contentType = regContentType;\n\t}\n\n\tgetMetricsAsArray() {\n\t\treturn Object.values(this._metrics);\n\t}\n\n\tasync getMetricsAsString(metrics) {\n\t\tconst metric =\n\t\t\ttypeof metrics.getForPromString === 'function'\n\t\t\t\t? await metrics.getForPromString()\n\t\t\t\t: await metrics.get();\n\n\t\tconst name = escapeString(metric.name);\n\t\tconst help = `# HELP ${name} ${escapeString(metric.help)}`;\n\t\tconst type = `# TYPE ${name} ${metric.type}`;\n\t\tconst values = [help, type];\n\n\t\tconst defaultLabels =\n\t\t\tObject.keys(this._defaultLabels).length > 0 ? this._defaultLabels : null;\n\n\t\tconst isOpenMetrics =\n\t\t\tthis.contentType === Registry.OPENMETRICS_CONTENT_TYPE;\n\n\t\tfor (const val of metric.values || []) {\n\t\t\tlet { metricName = name, labels = {} } = val;\n\t\t\tconst { sharedLabels = {} } = val;\n\t\t\tif (isOpenMetrics && metric.type === 'counter') {\n\t\t\t\tmetricName = `${metricName}_total`;\n\t\t\t}\n\n\t\t\tif (defaultLabels) {\n\t\t\t\tlabels = { ...labels, ...defaultLabels, ...labels };\n\t\t\t}\n\n\t\t\t// We have to flatten these separately to avoid duplicate labels appearing\n\t\t\t// between the base labels and the shared labels\n\t\t\tconst formattedLabels = formatLabels(labels, sharedLabels);\n\n\t\t\tconst flattenedShared = flattenSharedLabels(sharedLabels);\n\t\t\tconst labelParts = [...formattedLabels, flattenedShared].filter(Boolean);\n\t\t\tconst labelsString = labelParts.length ? `{${labelParts.join(',')}}` : '';\n\t\t\tlet fullMetricLine = `${metricName}${labelsString} ${getValueAsString(\n\t\t\t\tval.value,\n\t\t\t)}`;\n\n\t\t\tconst { exemplar } = val;\n\t\t\tif (exemplar && isOpenMetrics) {\n\t\t\t\tconst formattedExemplars = formatLabels(exemplar.labelSet);\n\t\t\t\tfullMetricLine += ` # {${formattedExemplars.join(\n\t\t\t\t\t',',\n\t\t\t\t)}} ${getValueAsString(exemplar.value)} ${exemplar.timestamp}`;\n\t\t\t}\n\t\t\tvalues.push(fullMetricLine);\n\t\t}\n\n\t\treturn values.join('\\n');\n\t}\n\n\tasync metrics() {\n\t\tconst isOpenMetrics =\n\t\t\tthis.contentType === Registry.OPENMETRICS_CONTENT_TYPE;\n\n\t\tconst promises = this.getMetricsAsArray().map(metric => {\n\t\t\tif (isOpenMetrics && metric.type === 'counter') {\n\t\t\t\tmetric.name = standardizeCounterName(metric.name);\n\t\t\t}\n\t\t\treturn this.getMetricsAsString(metric);\n\t\t});\n\n\t\tconst resolves = await Promise.all(promises);\n\n\t\treturn isOpenMetrics\n\t\t\t? `${resolves.join('\\n')}\\n# EOF\\n`\n\t\t\t: `${resolves.join('\\n\\n')}\\n`;\n\t}\n\n\tregisterMetric(metric) {\n\t\tif (this._metrics[metric.name] && this._metrics[metric.name] !== metric) {\n\t\t\tthrow new Error(\n\t\t\t\t`A metric with the name ${metric.name} has already been registered.`,\n\t\t\t);\n\t\t}\n\n\t\tthis._metrics[metric.name] = metric;\n\t}\n\n\tclear() {\n\t\tthis._metrics = {};\n\t\tthis._defaultLabels = {};\n\t}\n\n\tasync getMetricsAsJSON() {\n\t\tconst metrics = [];\n\t\tconst defaultLabelNames = Object.keys(this._defaultLabels);\n\n\t\tconst promises = [];\n\n\t\tfor (const metric of this.getMetricsAsArray()) {\n\t\t\tpromises.push(metric.get());\n\t\t}\n\n\t\tconst resolves = await Promise.all(promises);\n\n\t\tfor (const item of resolves) {\n\t\t\tif (item.values && defaultLabelNames.length > 0) {\n\t\t\t\tfor (const val of item.values) {\n\t\t\t\t\t// Make a copy before mutating\n\t\t\t\t\tval.labels = Object.assign({}, val.labels);\n\n\t\t\t\t\tfor (const labelName of defaultLabelNames) {\n\t\t\t\t\t\tval.labels[labelName] =\n\t\t\t\t\t\t\tval.labels[labelName] || this._defaultLabels[labelName];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmetrics.push(item);\n\t\t}\n\n\t\treturn metrics;\n\t}\n\n\tremoveSingleMetric(name) {\n\t\tdelete this._metrics[name];\n\t}\n\n\tgetSingleMetricAsString(name) {\n\t\treturn this.getMetricsAsString(this._metrics[name]);\n\t}\n\n\tgetSingleMetric(name) {\n\t\treturn this._metrics[name];\n\t}\n\n\tsetDefaultLabels(labels) {\n\t\tthis._defaultLabels = labels;\n\t}\n\n\tresetMetrics() {\n\t\tfor (const metric in this._metrics) {\n\t\t\tthis._metrics[metric].reset();\n\t\t}\n\t}\n\n\tget contentType() {\n\t\treturn this._contentType;\n\t}\n\n\tsetContentType(metricsContentType) {\n\t\tif (\n\t\t\tmetricsContentType === Registry.OPENMETRICS_CONTENT_TYPE ||\n\t\t\tmetricsContentType === Registry.PROMETHEUS_CONTENT_TYPE\n\t\t) {\n\t\t\tthis._contentType = metricsContentType;\n\t\t} else {\n\t\t\tthrow new Error(`Content type ${metricsContentType} is unsupported`);\n\t\t}\n\t}\n\n\tstatic merge(registers) {\n\t\tconst regType = registers[0].contentType;\n\t\tfor (const reg of registers) {\n\t\t\tif (reg.contentType !== regType) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Registers can only be merged if they have the same content type',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst mergedRegistry = new Registry(regType);\n\n\t\tconst metricsToMerge = registers.reduce(\n\t\t\t(acc, reg) => acc.concat(reg.getMetricsAsArray()),\n\t\t\t[],\n\t\t);\n\n\t\tmetricsToMerge.forEach(mergedRegistry.registerMetric, mergedRegistry);\n\t\treturn mergedRegistry;\n\t}\n}\n\nfunction formatLabels(labels, exclude) {\n\tconst { hasOwnProperty } = Object.prototype;\n\tconst formatted = [];\n\tfor (const [name, value] of Object.entries(labels)) {\n\t\tif (!exclude || !hasOwnProperty.call(exclude, name)) {\n\t\t\tformatted.push(`${name}=\"${escapeLabelValue(value)}\"`);\n\t\t}\n\t}\n\treturn formatted;\n}\n\nconst sharedLabelCache = new WeakMap();\nfunction flattenSharedLabels(labels) {\n\tconst cached = sharedLabelCache.get(labels);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst formattedLabels = formatLabels(labels);\n\tconst flattened = formattedLabels.join(',');\n\tsharedLabelCache.set(labels, flattened);\n\treturn flattened;\n}\nfunction escapeLabelValue(str) {\n\tif (typeof str !== 'string') {\n\t\treturn str;\n\t}\n\treturn escapeString(str).replace(/\"/g, '\\\\\"');\n}\nfunction escapeString(str) {\n\treturn str.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n');\n}\nfunction standardizeCounterName(name) {\n\treturn name.replace(/_total$/, '');\n}\n\nmodule.exports = Registry;\nmodule.exports.globalRegistry = new Registry();\n","'use strict';\n\nconst util = require('util');\n\n// These are from https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels\nconst metricRegexp = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/;\nconst labelRegexp = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\nexports.validateMetricName = function (name) {\n\treturn metricRegexp.test(name);\n};\n\nexports.validateLabelName = function (names = []) {\n\treturn names.every(name => labelRegexp.test(name));\n};\n\nexports.validateLabel = function validateLabel(savedLabels, labels) {\n\tfor (const label in labels) {\n\t\tif (!savedLabels.includes(label)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Added label \"${label}\" is not included in initial labelset: ${util.inspect(\n\t\t\t\t\tsavedLabels,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\t}\n};\n","'use strict';\n\nconst Registry = require('./registry');\nconst { isObject } = require('./util');\nconst { validateMetricName, validateLabelName } = require('./validation');\n\n/**\n * @abstract\n */\nclass Metric {\n\tconstructor(config, defaults = {}) {\n\t\tif (!isObject(config)) {\n\t\t\tthrow new TypeError('constructor expected a config object');\n\t\t}\n\t\tObject.assign(\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tlabelNames: [],\n\t\t\t\tregisters: [Registry.globalRegistry],\n\t\t\t\taggregator: 'sum',\n\t\t\t\tenableExemplars: false,\n\t\t\t},\n\t\t\tdefaults,\n\t\t\tconfig,\n\t\t);\n\t\tif (!this.registers) {\n\t\t\t// in case config.registers is `undefined`\n\t\t\tthis.registers = [Registry.globalRegistry];\n\t\t}\n\t\tif (!this.help) {\n\t\t\tthrow new Error('Missing mandatory help parameter');\n\t\t}\n\t\tif (!this.name) {\n\t\t\tthrow new Error('Missing mandatory name parameter');\n\t\t}\n\t\tif (!validateMetricName(this.name)) {\n\t\t\tthrow new Error('Invalid metric name');\n\t\t}\n\t\tif (!validateLabelName(this.labelNames)) {\n\t\t\tthrow new Error('Invalid label name');\n\t\t}\n\n\t\tif (this.collect && typeof this.collect !== 'function') {\n\t\t\tthrow new Error('Optional \"collect\" parameter must be a function');\n\t\t}\n\n\t\tif (this.labelNames) {\n\t\t\tthis.sortedLabelNames = [...this.labelNames].sort();\n\t\t} else {\n\t\t\tthis.sortedLabelNames = [];\n\t\t}\n\n\t\tthis.reset();\n\n\t\tfor (const register of this.registers) {\n\t\t\tif (\n\t\t\t\tthis.enableExemplars &&\n\t\t\t\tregister.contentType === Registry.PROMETHEUS_CONTENT_TYPE\n\t\t\t) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t'Exemplars are supported only on OpenMetrics registries',\n\t\t\t\t);\n\t\t\t}\n\t\t\tregister.registerMetric(this);\n\t\t}\n\t}\n\n\treset() {\n\t\t/* abstract */\n\t}\n}\n\nmodule.exports = { Metric };\n","'use strict';\n\n/**\n * Class representing an OpenMetrics exemplar.\n *\n * @property {object} labelSet\n * @property {number} value\n * @property {number} [timestamp]\n * */\nclass Exemplar {\n\tconstructor(labelSet = {}, value = null) {\n\t\tthis.labelSet = labelSet;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * Validation for the label set format.\n\t * https://github.com/OpenObservability/OpenMetrics/blob/d99b705f611b75fec8f450b05e344e02eea6921d/specification/OpenMetrics.md#exemplars\n\t *\n\t * @param {object} labelSet - Exemplar labels.\n\t * @throws {RangeError}\n\t * @return {void}\n\t */\n\tvalidateExemplarLabelSet(labelSet) {\n\t\tlet res = '';\n\t\tfor (const [labelName, labelValue] of Object.entries(labelSet)) {\n\t\t\tres += `${labelName}${labelValue}`;\n\t\t}\n\t\tif (res.length > 128) {\n\t\t\tthrow new RangeError(\n\t\t\t\t'Label set size must be smaller than 128 UTF-8 chars',\n\t\t\t);\n\t\t}\n\t}\n}\n\nmodule.exports = Exemplar;\n","/**\n * Counter metric\n */\n'use strict';\n\nconst util = require('util');\nconst {\n\thashObject,\n\tisObject,\n\tgetLabels,\n\tremoveLabels,\n\tnowTimestamp,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst Exemplar = require('./exemplar');\n\nclass Counter extends Metric {\n\tconstructor(config) {\n\t\tsuper(config);\n\t\tthis.type = 'counter';\n\t\tthis.defaultLabels = {};\n\t\tthis.defaultValue = 1;\n\t\tthis.defaultExemplarLabelSet = {};\n\t\tif (config.enableExemplars) {\n\t\t\tthis.enableExemplars = true;\n\t\t\tthis.inc = this.incWithExemplar;\n\t\t} else {\n\t\t\tthis.inc = this.incWithoutExemplar;\n\t\t}\n\t}\n\n\t/**\n\t * Increment counter\n\t * @param {object} labels - What label you want to be incremented\n\t * @param {Number} value - Value to increment, if omitted increment with 1\n\t * @returns {object} results - object with information about the inc operation\n\t * @returns {string} results.labelHash - hash representation of the labels\n\t */\n\tincWithoutExemplar(labels, value) {\n\t\tlet hash = '';\n\t\tif (isObject(labels)) {\n\t\t\thash = hashObject(labels, this.sortedLabelNames);\n\t\t\tvalidateLabel(this.labelNames, labels);\n\t\t} else {\n\t\t\tvalue = labels;\n\t\t\tlabels = {};\n\t\t}\n\n\t\tif (value && !Number.isFinite(value)) {\n\t\t\tthrow new TypeError(`Value is not a valid number: ${util.format(value)}`);\n\t\t}\n\t\tif (value < 0) {\n\t\t\tthrow new Error('It is not possible to decrease a counter');\n\t\t}\n\n\t\tif (value === null || value === undefined) value = 1;\n\n\t\tsetValue(this.hashMap, value, labels, hash);\n\n\t\treturn { labelHash: hash };\n\t}\n\n\t/**\n\t * Increment counter with exemplar, same as inc but accepts labels for an\n\t * exemplar.\n\t * If no label is provided the current exemplar labels are kept unchanged\n\t * (defaults to empty set).\n\t *\n\t * @param {object} incOpts - Object with options about what metric to increase\n\t * @param {object} incOpts.labels - What label you want to be incremented,\n\t * defaults to null (metric with no labels)\n\t * @param {Number} incOpts.value - Value to increment, defaults to 1\n\t * @param {object} incOpts.exemplarLabels - Key-value labels for the\n\t * exemplar, defaults to empty set {}\n\t * @returns {void}\n\t */\n\tincWithExemplar({\n\t\tlabels = this.defaultLabels,\n\t\tvalue = this.defaultValue,\n\t\texemplarLabels = this.defaultExemplarLabelSet,\n\t} = {}) {\n\t\tconst res = this.incWithoutExemplar(labels, value);\n\t\tthis.updateExemplar(exemplarLabels, value, res.labelHash);\n\t}\n\n\tupdateExemplar(exemplarLabels, value, hash) {\n\t\tif (exemplarLabels === this.defaultExemplarLabelSet) return;\n\t\tif (!isObject(this.hashMap[hash].exemplar)) {\n\t\t\tthis.hashMap[hash].exemplar = new Exemplar();\n\t\t}\n\t\tthis.hashMap[hash].exemplar.validateExemplarLabelSet(exemplarLabels);\n\t\tthis.hashMap[hash].exemplar.labelSet = exemplarLabels;\n\t\tthis.hashMap[hash].exemplar.value = value ? value : 1;\n\t\tthis.hashMap[hash].exemplar.timestamp = nowTimestamp();\n\t}\n\n\t/**\n\t * Reset counter\n\t * @returns {void}\n\t */\n\treset() {\n\t\tthis.hashMap = {};\n\t\tif (this.labelNames.length === 0) {\n\t\t\tsetValue(this.hashMap, 0);\n\t\t}\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\n\t\treturn {\n\t\t\thelp: this.help,\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tvalues: Object.values(this.hashMap),\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args) || {};\n\t\treturn {\n\t\t\tinc: this.inc.bind(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args) || {};\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn removeLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction setValue(hashMap, value, labels = {}, hash = '') {\n\tif (hashMap[hash]) {\n\t\thashMap[hash].value += value;\n\t} else {\n\t\thashMap[hash] = { value, labels };\n\t}\n\treturn hashMap;\n}\n\nmodule.exports = Counter;\n","/**\n * Gauge metric\n */\n'use strict';\n\nconst util = require('util');\n\nconst {\n\tsetValue,\n\tsetValueDelta,\n\tgetLabels,\n\thashObject,\n\tisObject,\n\tremoveLabels,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\n\nclass Gauge extends Metric {\n\tconstructor(config) {\n\t\tsuper(config);\n\t\tthis.type = 'gauge';\n\t}\n\n\t/**\n\t * Set a gauge to a value\n\t * @param {object} labels - Object with labels and their values\n\t * @param {Number} value - Value to set the gauge to, must be positive\n\t * @returns {void}\n\t */\n\tset(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tset(this, labels, value);\n\t}\n\n\t/**\n\t * Reset gauge\n\t * @returns {void}\n\t */\n\treset() {\n\t\tthis.hashMap = {};\n\t\tif (this.labelNames.length === 0) {\n\t\t\tsetValue(this.hashMap, 0, {});\n\t\t}\n\t}\n\n\t/**\n\t * Increment a gauge value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to increment - if omitted, increment with 1\n\t * @returns {void}\n\t */\n\tinc(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tif (value === undefined) value = 1;\n\t\tsetDelta(this, labels, value);\n\t}\n\n\t/**\n\t * Decrement a gauge value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to decrement - if omitted, decrement with 1\n\t * @returns {void}\n\t */\n\tdec(labels, value) {\n\t\tvalue = getValueArg(labels, value);\n\t\tlabels = getLabelArg(labels);\n\t\tif (value === undefined) value = 1;\n\t\tsetDelta(this, labels, -value);\n\t}\n\n\t/**\n\t * Set the gauge to current unix epoch\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {void}\n\t */\n\tsetToCurrentTime(labels) {\n\t\tconst now = Date.now() / 1000;\n\t\tif (labels === undefined) {\n\t\t\tthis.set(now);\n\t\t} else {\n\t\t\tthis.set(labels, now);\n\t\t}\n\t}\n\n\t/**\n\t * Start a timer\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Invoke this function to set the duration in seconds since you started the timer.\n\t * @example\n\t * var done = gauge.startTimer();\n\t * makeXHRRequest(function(err, response) {\n\t *\tdone(); //Duration of the request will be saved\n\t * });\n\t */\n\tstartTimer(labels) {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.set(Object.assign({}, labels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\treturn {\n\t\t\thelp: this.help,\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tvalues: Object.values(this.hashMap),\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\t_getValue(labels) {\n\t\tconst hash = hashObject(labels || {}, this.sortedLabelNames);\n\t\treturn this.hashMap[hash] ? this.hashMap[hash].value : 0;\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tinc: this.inc.bind(this, labels),\n\t\t\tdec: this.dec.bind(this, labels),\n\t\t\tset: this.set.bind(this, labels),\n\t\t\tsetToCurrentTime: this.setToCurrentTime.bind(this, labels),\n\t\t\tstartTimer: this.startTimer.bind(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction set(gauge, labels, value) {\n\tif (typeof value !== 'number') {\n\t\tthrow new TypeError(`Value is not a valid number: ${util.format(value)}`);\n\t}\n\n\tvalidateLabel(gauge.labelNames, labels);\n\tsetValue(gauge.hashMap, value, labels);\n}\n\nfunction setDelta(gauge, labels, delta) {\n\tif (typeof delta !== 'number') {\n\t\tthrow new TypeError(`Delta is not a valid number: ${util.format(delta)}`);\n\t}\n\n\tvalidateLabel(gauge.labelNames, labels);\n\tconst hash = hashObject(labels, gauge.sortedLabelNames);\n\tsetValueDelta(gauge.hashMap, delta, labels, hash);\n}\n\nfunction getLabelArg(labels) {\n\treturn isObject(labels) ? labels : {};\n}\n\nfunction getValueArg(labels, value) {\n\treturn isObject(labels) ? value : labels;\n}\n\nmodule.exports = Gauge;\n","/**\n * Histogram\n */\n'use strict';\n\nconst util = require('util');\nconst {\n\tgetLabels,\n\thashObject,\n\tisObject,\n\tremoveLabels,\n\tnowTimestamp,\n} = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst Exemplar = require('./exemplar');\n\nclass Histogram extends Metric {\n\tconstructor(config) {\n\t\tsuper(config, {\n\t\t\tbuckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n\t\t});\n\n\t\tthis.type = 'histogram';\n\t\tthis.defaultLabels = {};\n\t\tthis.defaultExemplarLabelSet = {};\n\t\tthis.enableExemplars = false;\n\n\t\tfor (const label of this.labelNames) {\n\t\t\tif (label === 'le') {\n\t\t\t\tthrow new Error('le is a reserved label keyword');\n\t\t\t}\n\t\t}\n\n\t\tthis.upperBounds = this.buckets;\n\t\tthis.bucketValues = this.upperBounds.reduce((acc, upperBound) => {\n\t\t\tacc[upperBound] = 0;\n\t\t\treturn acc;\n\t\t}, {});\n\n\t\tif (config.enableExemplars) {\n\t\t\tthis.enableExemplars = true;\n\t\t\tthis.bucketExemplars = this.upperBounds.reduce((acc, upperBound) => {\n\t\t\t\tacc[upperBound] = null;\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\t\t\tObject.freeze(this.bucketExemplars);\n\t\t\tthis.observe = this.observeWithExemplar;\n\t\t} else {\n\t\t\tthis.observe = this.observeWithoutExemplar;\n\t\t}\n\n\t\tObject.freeze(this.bucketValues);\n\t\tObject.freeze(this.upperBounds);\n\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthis.hashMap = {\n\t\t\t\t[hashObject({})]: createBaseValues(\n\t\t\t\t\t{},\n\t\t\t\t\tthis.bucketValues,\n\t\t\t\t\tthis.bucketExemplars,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Observe a value in histogram\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to observe in the histogram\n\t * @returns {void}\n\t */\n\tobserveWithoutExemplar(labels, value) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t}\n\n\tobserveWithExemplar({\n\t\tlabels = this.defaultLabels,\n\t\tvalue,\n\t\texemplarLabels = this.defaultExemplarLabelSet,\n\t} = {}) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t\tthis.updateExemplar(labels, value, exemplarLabels);\n\t}\n\n\tupdateExemplar(labels, value, exemplarLabels) {\n\t\tif (Object.keys(exemplarLabels).length === 0) return;\n\t\tconst hash = hashObject(labels, this.sortedLabelNames);\n\t\tconst bound = findBound(this.upperBounds, value);\n\t\tconst { bucketExemplars } = this.hashMap[hash];\n\t\tlet exemplar = bucketExemplars[bound];\n\t\tif (!isObject(exemplar)) {\n\t\t\texemplar = new Exemplar();\n\t\t\tbucketExemplars[bound] = exemplar;\n\t\t}\n\t\texemplar.validateExemplarLabelSet(exemplarLabels);\n\t\texemplar.labelSet = exemplarLabels;\n\t\texemplar.value = value;\n\t\texemplar.timestamp = nowTimestamp();\n\t}\n\n\tasync get() {\n\t\tconst data = await this.getForPromString();\n\t\tdata.values = data.values.map(splayLabels);\n\t\treturn data;\n\t}\n\n\tasync getForPromString() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\tconst data = Object.values(this.hashMap);\n\t\tconst values = data\n\t\t\t.map(extractBucketValuesForExport(this))\n\t\t\t.reduce(addSumAndCountForExport(this), []);\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\thelp: this.help,\n\t\t\ttype: this.type,\n\t\t\tvalues,\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\treset() {\n\t\tthis.hashMap = {};\n\t}\n\n\t/**\n\t * Initialize the metrics for the given combination of labels to zero\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {void}\n\t */\n\tzero(labels) {\n\t\tconst hash = hashObject(labels, this.sortedLabelNames);\n\t\tthis.hashMap[hash] = createBaseValues(\n\t\t\tlabels,\n\t\t\tthis.bucketValues,\n\t\t\tthis.bucketExemplars,\n\t\t);\n\t}\n\n\t/**\n\t * Start a timer that could be used to logging durations\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {object} exemplarLabels - Object with labels for exemplar where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Function to invoke when you want to stop the timer and observe the duration in seconds\n\t * @example\n\t * var end = histogram.startTimer();\n\t * makeExpensiveXHRRequest(function(err, res) {\n\t * \tconst duration = end(); //Observe the duration of expensiveXHRRequest and returns duration in seconds\n\t * \tconsole.log('Duration', duration);\n\t * });\n\t */\n\tstartTimer(labels, exemplarLabels) {\n\t\treturn this.enableExemplars\n\t\t\t? startTimerWithExemplar.call(this, labels, exemplarLabels)()\n\t\t\t: startTimer.call(this, labels)();\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tobserve: observe.call(this, labels),\n\t\t\tstartTimer: startTimer.call(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction startTimer(startLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe(Object.assign({}, startLabels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction startTimerWithExemplar(startLabels, startExemplarLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn (endLabels, endExemplarLabels) => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe({\n\t\t\t\tlabels: Object.assign({}, startLabels, endLabels),\n\t\t\t\tvalue,\n\t\t\t\texemplarLabels: Object.assign(\n\t\t\t\t\t{},\n\t\t\t\t\tstartExemplarLabels,\n\t\t\t\t\tendExemplarLabels,\n\t\t\t\t),\n\t\t\t});\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction setValuePair(labels, value, metricName, exemplar, sharedLabels = {}) {\n\treturn {\n\t\tlabels,\n\t\tsharedLabels,\n\t\tvalue,\n\t\tmetricName,\n\t\texemplar,\n\t};\n}\n\nfunction findBound(upperBounds, value) {\n\tfor (let i = 0; i < upperBounds.length; i++) {\n\t\tconst bound = upperBounds[i];\n\t\tif (value <= bound) {\n\t\t\treturn bound;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction observe(labels) {\n\treturn value => {\n\t\tconst labelValuePair = convertLabelsAndValues(labels, value);\n\n\t\tvalidateLabel(this.labelNames, labelValuePair.labels);\n\t\tif (!Number.isFinite(labelValuePair.value)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Value is not a valid number: ${util.format(labelValuePair.value)}`,\n\t\t\t);\n\t\t}\n\n\t\tconst hash = hashObject(labelValuePair.labels, this.sortedLabelNames);\n\t\tlet valueFromMap = this.hashMap[hash];\n\t\tif (!valueFromMap) {\n\t\t\tvalueFromMap = createBaseValues(\n\t\t\t\tlabelValuePair.labels,\n\t\t\t\tthis.bucketValues,\n\t\t\t\tthis.bucketExemplars,\n\t\t\t);\n\t\t}\n\n\t\tconst b = findBound(this.upperBounds, labelValuePair.value);\n\n\t\tvalueFromMap.sum += labelValuePair.value;\n\t\tvalueFromMap.count += 1;\n\n\t\tif (Object.prototype.hasOwnProperty.call(valueFromMap.bucketValues, b)) {\n\t\t\tvalueFromMap.bucketValues[b] += 1;\n\t\t}\n\n\t\tthis.hashMap[hash] = valueFromMap;\n\t};\n}\n\nfunction createBaseValues(labels, bucketValues, bucketExemplars) {\n\tconst result = {\n\t\tlabels,\n\t\tbucketValues: { ...bucketValues },\n\t\tsum: 0,\n\t\tcount: 0,\n\t};\n\tif (bucketExemplars) {\n\t\tresult.bucketExemplars = { ...bucketExemplars };\n\t}\n\treturn result;\n}\n\nfunction convertLabelsAndValues(labels, value) {\n\treturn isObject(labels)\n\t\t? {\n\t\t\t\tlabels,\n\t\t\t\tvalue,\n\t\t\t}\n\t\t: {\n\t\t\t\tvalue: labels,\n\t\t\t\tlabels: {},\n\t\t\t};\n}\n\nfunction extractBucketValuesForExport(histogram) {\n\tconst name = `${histogram.name}_bucket`;\n\treturn bucketData => {\n\t\tlet acc = 0;\n\t\tconst buckets = histogram.upperBounds.map(upperBound => {\n\t\t\tacc += bucketData.bucketValues[upperBound];\n\t\t\treturn setValuePair(\n\t\t\t\t{ le: upperBound },\n\t\t\t\tacc,\n\t\t\t\tname,\n\t\t\t\tbucketData.bucketExemplars\n\t\t\t\t\t? bucketData.bucketExemplars[upperBound]\n\t\t\t\t\t: null,\n\t\t\t\tbucketData.labels,\n\t\t\t);\n\t\t});\n\t\treturn { buckets, data: bucketData };\n\t};\n}\n\nfunction addSumAndCountForExport(histogram) {\n\treturn (acc, d) => {\n\t\tacc.push(...d.buckets);\n\n\t\tconst infLabel = { le: '+Inf' };\n\t\tacc.push(\n\t\t\tsetValuePair(\n\t\t\t\tinfLabel,\n\t\t\t\td.data.count,\n\t\t\t\t`${histogram.name}_bucket`,\n\t\t\t\td.data.bucketExemplars ? d.data.bucketExemplars['-1'] : null,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t\tsetValuePair(\n\t\t\t\t{},\n\t\t\t\td.data.sum,\n\t\t\t\t`${histogram.name}_sum`,\n\t\t\t\tundefined,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t\tsetValuePair(\n\t\t\t\t{},\n\t\t\t\td.data.count,\n\t\t\t\t`${histogram.name}_count`,\n\t\t\t\tundefined,\n\t\t\t\td.data.labels,\n\t\t\t),\n\t\t);\n\t\treturn acc;\n\t};\n}\n\nfunction splayLabels(bucket) {\n\tconst { sharedLabels, labels, ...newBucket } = bucket;\n\tfor (const label of Object.keys(sharedLabels)) {\n\t\tlabels[label] = sharedLabels[label];\n\t}\n\tnewBucket.labels = labels;\n\treturn newBucket;\n}\n\nmodule.exports = Histogram;\n","\nfunction TreeBase() {}\n\n// removes all nodes from the tree\nTreeBase.prototype.clear = function() {\n this._root = null;\n this.size = 0;\n};\n\n// returns node data if found, null otherwise\nTreeBase.prototype.find = function(data) {\n var res = this._root;\n\n while(res !== null) {\n var c = this._comparator(data, res.data);\n if(c === 0) {\n return res.data;\n }\n else {\n res = res.get_child(c > 0);\n }\n }\n\n return null;\n};\n\n// returns iterator to node if found, null otherwise\nTreeBase.prototype.findIter = function(data) {\n var res = this._root;\n var iter = this.iterator();\n\n while(res !== null) {\n var c = this._comparator(data, res.data);\n if(c === 0) {\n iter._cursor = res;\n return iter;\n }\n else {\n iter._ancestors.push(res);\n res = res.get_child(c > 0);\n }\n }\n\n return null;\n};\n\n// Returns an iterator to the tree node at or immediately after the item\nTreeBase.prototype.lowerBound = function(item) {\n var cur = this._root;\n var iter = this.iterator();\n var cmp = this._comparator;\n\n while(cur !== null) {\n var c = cmp(item, cur.data);\n if(c === 0) {\n iter._cursor = cur;\n return iter;\n }\n iter._ancestors.push(cur);\n cur = cur.get_child(c > 0);\n }\n\n for(var i=iter._ancestors.length - 1; i >= 0; --i) {\n cur = iter._ancestors[i];\n if(cmp(item, cur.data) < 0) {\n iter._cursor = cur;\n iter._ancestors.length = i;\n return iter;\n }\n }\n\n iter._ancestors.length = 0;\n return iter;\n};\n\n// Returns an iterator to the tree node immediately after the item\nTreeBase.prototype.upperBound = function(item) {\n var iter = this.lowerBound(item);\n var cmp = this._comparator;\n\n while(iter.data() !== null && cmp(iter.data(), item) === 0) {\n iter.next();\n }\n\n return iter;\n};\n\n// returns null if tree is empty\nTreeBase.prototype.min = function() {\n var res = this._root;\n if(res === null) {\n return null;\n }\n\n while(res.left !== null) {\n res = res.left;\n }\n\n return res.data;\n};\n\n// returns null if tree is empty\nTreeBase.prototype.max = function() {\n var res = this._root;\n if(res === null) {\n return null;\n }\n\n while(res.right !== null) {\n res = res.right;\n }\n\n return res.data;\n};\n\n// returns a null iterator\n// call next() or prev() to point to an element\nTreeBase.prototype.iterator = function() {\n return new Iterator(this);\n};\n\n// calls cb on each node's data, in order\nTreeBase.prototype.each = function(cb) {\n var it=this.iterator(), data;\n while((data = it.next()) !== null) {\n if(cb(data) === false) {\n return;\n }\n }\n};\n\n// calls cb on each node's data, in reverse order\nTreeBase.prototype.reach = function(cb) {\n var it=this.iterator(), data;\n while((data = it.prev()) !== null) {\n if(cb(data) === false) {\n return;\n }\n }\n};\n\n\nfunction Iterator(tree) {\n this._tree = tree;\n this._ancestors = [];\n this._cursor = null;\n}\n\nIterator.prototype.data = function() {\n return this._cursor !== null ? this._cursor.data : null;\n};\n\n// if null-iterator, returns first node\n// otherwise, returns next node\nIterator.prototype.next = function() {\n if(this._cursor === null) {\n var root = this._tree._root;\n if(root !== null) {\n this._minNode(root);\n }\n }\n else {\n if(this._cursor.right === null) {\n // no greater node in subtree, go up to parent\n // if coming from a right child, continue up the stack\n var save;\n do {\n save = this._cursor;\n if(this._ancestors.length) {\n this._cursor = this._ancestors.pop();\n }\n else {\n this._cursor = null;\n break;\n }\n } while(this._cursor.right === save);\n }\n else {\n // get the next node from the subtree\n this._ancestors.push(this._cursor);\n this._minNode(this._cursor.right);\n }\n }\n return this._cursor !== null ? this._cursor.data : null;\n};\n\n// if null-iterator, returns last node\n// otherwise, returns previous node\nIterator.prototype.prev = function() {\n if(this._cursor === null) {\n var root = this._tree._root;\n if(root !== null) {\n this._maxNode(root);\n }\n }\n else {\n if(this._cursor.left === null) {\n var save;\n do {\n save = this._cursor;\n if(this._ancestors.length) {\n this._cursor = this._ancestors.pop();\n }\n else {\n this._cursor = null;\n break;\n }\n } while(this._cursor.left === save);\n }\n else {\n this._ancestors.push(this._cursor);\n this._maxNode(this._cursor.left);\n }\n }\n return this._cursor !== null ? this._cursor.data : null;\n};\n\nIterator.prototype._minNode = function(start) {\n while(start.left !== null) {\n this._ancestors.push(start);\n start = start.left;\n }\n this._cursor = start;\n};\n\nIterator.prototype._maxNode = function(start) {\n while(start.right !== null) {\n this._ancestors.push(start);\n start = start.right;\n }\n this._cursor = start;\n};\n\nmodule.exports = TreeBase;\n\n","\nvar TreeBase = require('./treebase');\n\nfunction Node(data) {\n this.data = data;\n this.left = null;\n this.right = null;\n this.red = true;\n}\n\nNode.prototype.get_child = function(dir) {\n return dir ? this.right : this.left;\n};\n\nNode.prototype.set_child = function(dir, val) {\n if(dir) {\n this.right = val;\n }\n else {\n this.left = val;\n }\n};\n\nfunction RBTree(comparator) {\n this._root = null;\n this._comparator = comparator;\n this.size = 0;\n}\n\nRBTree.prototype = new TreeBase();\n\n// returns true if inserted, false if duplicate\nRBTree.prototype.insert = function(data) {\n var ret = false;\n\n if(this._root === null) {\n // empty tree\n this._root = new Node(data);\n ret = true;\n this.size++;\n }\n else {\n var head = new Node(undefined); // fake tree root\n\n var dir = 0;\n var last = 0;\n\n // setup\n var gp = null; // grandparent\n var ggp = head; // grand-grand-parent\n var p = null; // parent\n var node = this._root;\n ggp.right = this._root;\n\n // search down\n while(true) {\n if(node === null) {\n // insert new node at the bottom\n node = new Node(data);\n p.set_child(dir, node);\n ret = true;\n this.size++;\n }\n else if(is_red(node.left) && is_red(node.right)) {\n // color flip\n node.red = true;\n node.left.red = false;\n node.right.red = false;\n }\n\n // fix red violation\n if(is_red(node) && is_red(p)) {\n var dir2 = ggp.right === gp;\n\n if(node === p.get_child(last)) {\n ggp.set_child(dir2, single_rotate(gp, !last));\n }\n else {\n ggp.set_child(dir2, double_rotate(gp, !last));\n }\n }\n\n var cmp = this._comparator(node.data, data);\n\n // stop if found\n if(cmp === 0) {\n break;\n }\n\n last = dir;\n dir = cmp < 0;\n\n // update helpers\n if(gp !== null) {\n ggp = gp;\n }\n gp = p;\n p = node;\n node = node.get_child(dir);\n }\n\n // update root\n this._root = head.right;\n }\n\n // make root black\n this._root.red = false;\n\n return ret;\n};\n\n// returns true if removed, false if not found\nRBTree.prototype.remove = function(data) {\n if(this._root === null) {\n return false;\n }\n\n var head = new Node(undefined); // fake tree root\n var node = head;\n node.right = this._root;\n var p = null; // parent\n var gp = null; // grand parent\n var found = null; // found item\n var dir = 1;\n\n while(node.get_child(dir) !== null) {\n var last = dir;\n\n // update helpers\n gp = p;\n p = node;\n node = node.get_child(dir);\n\n var cmp = this._comparator(data, node.data);\n\n dir = cmp > 0;\n\n // save found node\n if(cmp === 0) {\n found = node;\n }\n\n // push the red node down\n if(!is_red(node) && !is_red(node.get_child(dir))) {\n if(is_red(node.get_child(!dir))) {\n var sr = single_rotate(node, dir);\n p.set_child(last, sr);\n p = sr;\n }\n else if(!is_red(node.get_child(!dir))) {\n var sibling = p.get_child(!last);\n if(sibling !== null) {\n if(!is_red(sibling.get_child(!last)) && !is_red(sibling.get_child(last))) {\n // color flip\n p.red = false;\n sibling.red = true;\n node.red = true;\n }\n else {\n var dir2 = gp.right === p;\n\n if(is_red(sibling.get_child(last))) {\n gp.set_child(dir2, double_rotate(p, last));\n }\n else if(is_red(sibling.get_child(!last))) {\n gp.set_child(dir2, single_rotate(p, last));\n }\n\n // ensure correct coloring\n var gpc = gp.get_child(dir2);\n gpc.red = true;\n node.red = true;\n gpc.left.red = false;\n gpc.right.red = false;\n }\n }\n }\n }\n }\n\n // replace and remove if found\n if(found !== null) {\n found.data = node.data;\n p.set_child(p.right === node, node.get_child(node.left === null));\n this.size--;\n }\n\n // update root and make it black\n this._root = head.right;\n if(this._root !== null) {\n this._root.red = false;\n }\n\n return found !== null;\n};\n\nfunction is_red(node) {\n return node !== null && node.red;\n}\n\nfunction single_rotate(root, dir) {\n var save = root.get_child(!dir);\n\n root.set_child(!dir, save.get_child(dir));\n save.set_child(dir, root);\n\n root.red = true;\n save.red = false;\n\n return save;\n}\n\nfunction double_rotate(root, dir) {\n root.set_child(!dir, single_rotate(root.get_child(!dir), !dir));\n return single_rotate(root, dir);\n}\n\nmodule.exports = RBTree;\n","\nvar TreeBase = require('./treebase');\n\nfunction Node(data) {\n this.data = data;\n this.left = null;\n this.right = null;\n}\n\nNode.prototype.get_child = function(dir) {\n return dir ? this.right : this.left;\n};\n\nNode.prototype.set_child = function(dir, val) {\n if(dir) {\n this.right = val;\n }\n else {\n this.left = val;\n }\n};\n\nfunction BinTree(comparator) {\n this._root = null;\n this._comparator = comparator;\n this.size = 0;\n}\n\nBinTree.prototype = new TreeBase();\n\n// returns true if inserted, false if duplicate\nBinTree.prototype.insert = function(data) {\n if(this._root === null) {\n // empty tree\n this._root = new Node(data);\n this.size++;\n return true;\n }\n\n var dir = 0;\n\n // setup\n var p = null; // parent\n var node = this._root;\n\n // search down\n while(true) {\n if(node === null) {\n // insert new node at the bottom\n node = new Node(data);\n p.set_child(dir, node);\n ret = true;\n this.size++;\n return true;\n }\n\n // stop if found\n if(this._comparator(node.data, data) === 0) {\n return false;\n }\n\n dir = this._comparator(node.data, data) < 0;\n\n // update helpers\n p = node;\n node = node.get_child(dir);\n }\n};\n\n// returns true if removed, false if not found\nBinTree.prototype.remove = function(data) {\n if(this._root === null) {\n return false;\n }\n\n var head = new Node(undefined); // fake tree root\n var node = head;\n node.right = this._root;\n var p = null; // parent\n var found = null; // found item\n var dir = 1;\n\n while(node.get_child(dir) !== null) {\n p = node;\n node = node.get_child(dir);\n var cmp = this._comparator(data, node.data);\n dir = cmp > 0;\n\n if(cmp === 0) {\n found = node;\n }\n }\n\n if(found !== null) {\n found.data = node.data;\n p.set_child(p.right === node, node.get_child(node.left === null));\n\n this._root = head.right;\n this.size--;\n return true;\n }\n else {\n return false;\n }\n};\n\nmodule.exports = BinTree;\n\n","module.exports = {\n RBTree: require('./lib/rbtree'),\n BinTree: require('./lib/bintree')\n};\n","//\n// TDigest:\n//\n// approximate distribution percentiles from a stream of reals\n//\nvar RBTree = require('bintrees').RBTree;\n\nfunction TDigest(delta, K, CX) {\n // allocate a TDigest structure.\n //\n // delta is the compression factor, the max fraction of mass that\n // can be owned by one centroid (bigger, up to 1.0, means more\n // compression). delta=false switches off TDigest behavior and treats\n // the distribution as discrete, with no merging and exact values\n // reported.\n //\n // K is a size threshold that triggers recompression as the TDigest\n // grows during input. (Set it to 0 to disable automatic recompression)\n //\n // CX specifies how often to update cached cumulative totals used\n // for quantile estimation during ingest (see cumulate()). Set to\n // 0 to use exact quantiles for each new point.\n //\n this.discrete = (delta === false);\n this.delta = delta || 0.01;\n this.K = (K === undefined) ? 25 : K;\n this.CX = (CX === undefined) ? 1.1 : CX;\n this.centroids = new RBTree(compare_centroid_means);\n this.nreset = 0;\n this.reset();\n}\n\nTDigest.prototype.reset = function() {\n // prepare to digest new points.\n //\n this.centroids.clear();\n this.n = 0;\n this.nreset += 1;\n this.last_cumulate = 0;\n};\n\nTDigest.prototype.size = function() {\n return this.centroids.size;\n};\n\nTDigest.prototype.toArray = function(everything) {\n // return {mean,n} of centroids as an array ordered by mean.\n //\n var result = [];\n if (everything) {\n this._cumulate(true); // be sure cumns are exact\n this.centroids.each(function(c) { result.push(c); });\n } else {\n this.centroids.each(function(c) { result.push({mean:c.mean, n:c.n}); });\n }\n return result;\n};\n\nTDigest.prototype.summary = function() {\n var approx = (this.discrete) ? \"exact \" : \"approximating \";\n var s = [approx + this.n + \" samples using \" + this.size() + \" centroids\",\n \"min = \"+this.percentile(0),\n \"Q1 = \"+this.percentile(0.25),\n \"Q2 = \"+this.percentile(0.5),\n \"Q3 = \"+this.percentile(0.75),\n \"max = \"+this.percentile(1.0)];\n return s.join('\\n');\n};\n\nfunction compare_centroid_means(a, b) {\n // order two centroids by mean.\n //\n return (a.mean > b.mean) ? 1 : (a.mean < b.mean) ? -1 : 0;\n}\n\nfunction compare_centroid_mean_cumns(a, b) {\n // order two centroids by mean_cumn.\n //\n return (a.mean_cumn - b.mean_cumn);\n}\n\nTDigest.prototype.push = function(x, n) {\n // incorporate value or array of values x, having count n into the\n // TDigest. n defaults to 1.\n //\n n = n || 1;\n x = Array.isArray(x) ? x : [x];\n for (var i = 0 ; i < x.length ; i++) {\n this._digest(x[i], n);\n }\n};\n\nTDigest.prototype.push_centroid = function(c) {\n // incorporate centroid or array of centroids c\n //\n c = Array.isArray(c) ? c : [c];\n for (var i = 0 ; i < c.length ; i++) {\n this._digest(c[i].mean, c[i].n);\n }\n};\n\nTDigest.prototype._cumulate = function(exact) {\n // update cumulative counts for each centroid\n //\n // exact: falsey means only cumulate after sufficient\n // growth. During ingest, these counts are used as quantile\n // estimates, and they work well even when somewhat out of\n // date. (this is a departure from the publication, you may set CX\n // to 0 to disable).\n //\n if (this.n === this.last_cumulate ||\n !exact && this.CX && this.CX > (this.n / this.last_cumulate)) {\n return;\n }\n var cumn = 0;\n this.centroids.each(function(c) {\n c.mean_cumn = cumn + c.n / 2; // half of n at the mean\n cumn = c.cumn = cumn + c.n;\n });\n this.n = this.last_cumulate = cumn;\n};\n\nTDigest.prototype.find_nearest = function(x) {\n // find the centroid closest to x. The assumption of\n // unique means and a unique nearest centroid departs from the\n // paper, see _digest() below\n //\n if (this.size() === 0) {\n return null;\n }\n var iter = this.centroids.lowerBound({mean:x}); // x <= iter || iter==null\n var c = (iter.data() === null) ? iter.prev() : iter.data();\n if (c.mean === x || this.discrete) {\n return c; // c is either x or a neighbor (discrete: no distance func)\n }\n var prev = iter.prev();\n if (prev && Math.abs(prev.mean - x) < Math.abs(c.mean - x)) {\n return prev;\n } else {\n return c;\n }\n};\n\nTDigest.prototype._new_centroid = function(x, n, cumn) {\n // create and insert a new centroid into the digest (don't update\n // cumulatives).\n //\n var c = {mean:x, n:n, cumn:cumn};\n this.centroids.insert(c);\n this.n += n;\n return c;\n};\n\nTDigest.prototype._addweight = function(nearest, x, n) {\n // add weight at location x to nearest centroid. adding x to\n // nearest will not shift its relative position in the tree and\n // require reinsertion.\n //\n if (x !== nearest.mean) {\n nearest.mean += n * (x - nearest.mean) / (nearest.n + n);\n }\n nearest.cumn += n;\n nearest.mean_cumn += n / 2;\n nearest.n += n;\n this.n += n;\n};\n\nTDigest.prototype._digest = function(x, n) {\n // incorporate value x, having count n into the TDigest.\n //\n var min = this.centroids.min();\n var max = this.centroids.max();\n var nearest = this.find_nearest(x);\n if (nearest && nearest.mean === x) {\n // accumulate exact matches into the centroid without\n // limit. this is a departure from the paper, made so\n // centroids remain unique and code can be simple.\n this._addweight(nearest, x, n);\n } else if (nearest === min) {\n this._new_centroid(x, n, 0); // new point around min boundary\n } else if (nearest === max ) {\n this._new_centroid(x, n, this.n); // new point around max boundary\n } else if (this.discrete) {\n this._new_centroid(x, n, nearest.cumn); // never merge\n } else {\n // conider a merge based on nearest centroid's capacity. if\n // there's not room for all of n, don't bother merging any of\n // it into nearest, as we'll have to make a new centroid\n // anyway for the remainder (departure from the paper).\n var p = nearest.mean_cumn / this.n;\n var max_n = Math.floor(4 * this.n * this.delta * p * (1 - p));\n if (max_n - nearest.n >= n) {\n this._addweight(nearest, x, n);\n } else {\n this._new_centroid(x, n, nearest.cumn);\n }\n }\n this._cumulate(false);\n if (!this.discrete && this.K && this.size() > this.K / this.delta) {\n // re-process the centroids and hope for some compression.\n this.compress();\n }\n};\n\nTDigest.prototype.bound_mean = function(x) {\n // find centroids lower and upper such that lower.mean < x <\n // upper.mean or lower.mean === x === upper.mean. Don't call\n // this for x out of bounds.\n //\n var iter = this.centroids.upperBound({mean:x}); // x < iter\n var lower = iter.prev(); // lower <= x\n var upper = (lower.mean === x) ? lower : iter.next();\n return [lower, upper];\n};\n\nTDigest.prototype.p_rank = function(x_or_xlist) {\n // return approximate percentile-ranks (0..1) for data value x.\n // or list of x. calculated according to\n // https://en.wikipedia.org/wiki/Percentile_rank\n //\n // (Note that in continuous mode, boundary sample values will\n // report half their centroid weight inward from 0/1 as the\n // percentile-rank. X values outside the observed range return\n // 0/1)\n //\n // this triggers cumulate() if cumn's are out of date.\n //\n var xs = Array.isArray(x_or_xlist) ? x_or_xlist : [x_or_xlist];\n var ps = xs.map(this._p_rank, this);\n return Array.isArray(x_or_xlist) ? ps : ps[0];\n};\n\nTDigest.prototype._p_rank = function(x) {\n if (this.size() === 0) {\n return undefined;\n } else if (x < this.centroids.min().mean) {\n return 0.0;\n } else if (x > this.centroids.max().mean) {\n return 1.0;\n }\n // find centroids that bracket x and interpolate x's cumn from\n // their cumn's.\n this._cumulate(true); // be sure cumns are exact\n var bound = this.bound_mean(x);\n var lower = bound[0], upper = bound[1];\n if (this.discrete) {\n return lower.cumn / this.n;\n } else {\n var cumn = lower.mean_cumn;\n if (lower !== upper) {\n cumn += (x - lower.mean) * (upper.mean_cumn - lower.mean_cumn) / (upper.mean - lower.mean);\n }\n return cumn / this.n;\n }\n};\n\nTDigest.prototype.bound_mean_cumn = function(cumn) {\n // find centroids lower and upper such that lower.mean_cumn < x <\n // upper.mean_cumn or lower.mean_cumn === x === upper.mean_cumn. Don't call\n // this for cumn out of bounds.\n //\n // XXX because mean and mean_cumn give rise to the same sort order\n // (up to identical means), use the mean rbtree for our search.\n this.centroids._comparator = compare_centroid_mean_cumns;\n var iter = this.centroids.upperBound({mean_cumn:cumn}); // cumn < iter\n this.centroids._comparator = compare_centroid_means;\n var lower = iter.prev(); // lower <= cumn\n var upper = (lower && lower.mean_cumn === cumn) ? lower : iter.next();\n return [lower, upper];\n};\n\nTDigest.prototype.percentile = function(p_or_plist) {\n // for percentage p (0..1), or for each p in a list of ps, return\n // the smallest data value q at which at least p percent of the\n // observations <= q.\n //\n // for discrete distributions, this selects q using the Nearest\n // Rank Method\n // (https://en.wikipedia.org/wiki/Percentile#The_Nearest_Rank_method)\n // (in scipy, same as percentile(...., interpolation='higher')\n //\n // for continuous distributions, interpolates data values between\n // count-weighted bracketing means.\n //\n // this triggers cumulate() if cumn's are out of date.\n //\n var ps = Array.isArray(p_or_plist) ? p_or_plist : [p_or_plist];\n var qs = ps.map(this._percentile, this);\n return Array.isArray(p_or_plist) ? qs : qs[0];\n};\n\nTDigest.prototype._percentile = function(p) {\n if (this.size() === 0) {\n return undefined;\n }\n this._cumulate(true); // be sure cumns are exact\n var h = this.n * p;\n var bound = this.bound_mean_cumn(h);\n var lower = bound[0], upper = bound[1];\n\n if (upper === lower || lower === null || upper === null) {\n return (lower || upper).mean;\n } else if (!this.discrete) {\n return lower.mean + (h - lower.mean_cumn) * (upper.mean - lower.mean) / (upper.mean_cumn - lower.mean_cumn);\n } else if (h <= lower.cumn) {\n return lower.mean;\n } else {\n return upper.mean;\n }\n};\n\nfunction pop_random(choices) {\n // remove and return an item randomly chosen from the array of choices\n // (mutates choices)\n //\n var idx = Math.floor(Math.random() * choices.length);\n return choices.splice(idx, 1)[0];\n}\n\nTDigest.prototype.compress = function() {\n // TDigests experience worst case compression (none) when input\n // increases monotonically. Improve on any bad luck by\n // reconsuming digest centroids as if they were weighted points\n // while shuffling their order (and hope for the best).\n //\n if (this.compressing) {\n return;\n }\n var points = this.toArray();\n this.reset();\n this.compressing = true;\n while (points.length > 0) {\n this.push_centroid(pop_random(points));\n }\n this._cumulate(true);\n this.compressing = false;\n};\n\nfunction Digest(config) {\n // allocate a distribution digest structure. This is an extension\n // of a TDigest structure that starts in exact histogram (discrete)\n // mode, and automatically switches to TDigest mode for large\n // samples that appear to be from a continuous distribution.\n //\n this.config = config || {};\n this.mode = this.config.mode || 'auto'; // disc, cont, auto\n TDigest.call(this, this.mode === 'cont' ? config.delta : false);\n this.digest_ratio = this.config.ratio || 0.9;\n this.digest_thresh = this.config.thresh || 1000;\n this.n_unique = 0;\n}\nDigest.prototype = Object.create(TDigest.prototype);\nDigest.prototype.constructor = Digest;\n\nDigest.prototype.push = function(x_or_xlist) {\n TDigest.prototype.push.call(this, x_or_xlist);\n this.check_continuous();\n};\n\nDigest.prototype._new_centroid = function(x, n, cumn) {\n this.n_unique += 1;\n TDigest.prototype._new_centroid.call(this, x, n, cumn);\n};\n\nDigest.prototype._addweight = function(nearest, x, n) {\n if (nearest.n === 1) {\n this.n_unique -= 1;\n }\n TDigest.prototype._addweight.call(this, nearest, x, n);\n};\n\nDigest.prototype.check_continuous = function() {\n // while in 'auto' mode, if there are many unique elements, assume\n // they are from a continuous distribution and switch to 'cont'\n // mode (tdigest behavior). Return true on transition from\n // disctete to continuous.\n if (this.mode !== 'auto' || this.size() < this.digest_thresh) {\n return false;\n }\n if (this.n_unique / this.size() > this.digest_ratio) {\n this.mode = 'cont';\n this.discrete = false;\n this.delta = this.config.delta || 0.01;\n this.compress();\n return true;\n }\n return false;\n};\n\nmodule.exports = {\n 'TDigest': TDigest,\n 'Digest': Digest\n};\n","'use strict';\n\nconst { TDigest } = require('tdigest');\n\nclass TimeWindowQuantiles {\n\tconstructor(maxAgeSeconds, ageBuckets) {\n\t\tthis.maxAgeSeconds = maxAgeSeconds || 0;\n\t\tthis.ageBuckets = ageBuckets || 0;\n\n\t\tthis.shouldRotate = maxAgeSeconds && ageBuckets;\n\n\t\tthis.ringBuffer = Array(ageBuckets).fill(new TDigest());\n\t\tthis.currentBuffer = 0;\n\n\t\tthis.lastRotateTimestampMillis = Date.now();\n\t\tthis.durationBetweenRotatesMillis =\n\t\t\t(maxAgeSeconds * 1000) / ageBuckets || Infinity;\n\t}\n\n\tsize() {\n\t\tconst bucket = rotate.call(this);\n\t\treturn bucket.size();\n\t}\n\n\tpercentile(quantile) {\n\t\tconst bucket = rotate.call(this);\n\t\treturn bucket.percentile(quantile);\n\t}\n\n\tpush(value) {\n\t\trotate.call(this);\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.push(value);\n\t\t});\n\t}\n\n\treset() {\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.reset();\n\t\t});\n\t}\n\n\tcompress() {\n\t\tthis.ringBuffer.forEach(bucket => {\n\t\t\tbucket.compress();\n\t\t});\n\t}\n}\n\nfunction rotate() {\n\tlet timeSinceLastRotateMillis = Date.now() - this.lastRotateTimestampMillis;\n\twhile (\n\t\ttimeSinceLastRotateMillis > this.durationBetweenRotatesMillis &&\n\t\tthis.shouldRotate\n\t) {\n\t\tthis.ringBuffer[this.currentBuffer] = new TDigest();\n\n\t\tif (++this.currentBuffer >= this.ringBuffer.length) {\n\t\t\tthis.currentBuffer = 0;\n\t\t}\n\t\ttimeSinceLastRotateMillis -= this.durationBetweenRotatesMillis;\n\t\tthis.lastRotateTimestampMillis += this.durationBetweenRotatesMillis;\n\t}\n\treturn this.ringBuffer[this.currentBuffer];\n}\n\nmodule.exports = TimeWindowQuantiles;\n","/**\n * Summary\n */\n'use strict';\n\nconst util = require('util');\nconst { getLabels, hashObject, removeLabels } = require('./util');\nconst { validateLabel } = require('./validation');\nconst { Metric } = require('./metric');\nconst timeWindowQuantiles = require('./timeWindowQuantiles');\n\nconst DEFAULT_COMPRESS_COUNT = 1000; // every 1000 measurements\n\nclass Summary extends Metric {\n\tconstructor(config) {\n\t\tsuper(config, {\n\t\t\tpercentiles: [0.01, 0.05, 0.5, 0.9, 0.95, 0.99, 0.999],\n\t\t\tcompressCount: DEFAULT_COMPRESS_COUNT,\n\t\t\thashMap: {},\n\t\t});\n\n\t\tthis.type = 'summary';\n\n\t\tfor (const label of this.labelNames) {\n\t\t\tif (label === 'quantile')\n\t\t\t\tthrow new Error('quantile is a reserved label keyword');\n\t\t}\n\n\t\tif (this.labelNames.length === 0) {\n\t\t\tthis.hashMap = {\n\t\t\t\t[hashObject({})]: {\n\t\t\t\t\tlabels: {},\n\t\t\t\t\ttd: new timeWindowQuantiles(this.maxAgeSeconds, this.ageBuckets),\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tsum: 0,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Observe a value\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @param {Number} value - Value to observe\n\t * @returns {void}\n\t */\n\tobserve(labels, value) {\n\t\tobserve.call(this, labels === 0 ? 0 : labels || {})(value);\n\t}\n\n\tasync get() {\n\t\tif (this.collect) {\n\t\t\tconst v = this.collect();\n\t\t\tif (v instanceof Promise) await v;\n\t\t}\n\t\tconst hashKeys = Object.keys(this.hashMap);\n\t\tconst values = [];\n\n\t\thashKeys.forEach(hashKey => {\n\t\t\tconst s = this.hashMap[hashKey];\n\t\t\tif (s) {\n\t\t\t\tif (this.pruneAgedBuckets && s.td.size() === 0) {\n\t\t\t\t\tdelete this.hashMap[hashKey];\n\t\t\t\t} else {\n\t\t\t\t\textractSummariesForExport(s, this.percentiles).forEach(v => {\n\t\t\t\t\t\tvalues.push(v);\n\t\t\t\t\t});\n\t\t\t\t\tvalues.push(getSumForExport(s, this));\n\t\t\t\t\tvalues.push(getCountForExport(s, this));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\thelp: this.help,\n\t\t\ttype: this.type,\n\t\t\tvalues,\n\t\t\taggregator: this.aggregator,\n\t\t};\n\t}\n\n\treset() {\n\t\tconst data = Object.values(this.hashMap);\n\t\tdata.forEach(s => {\n\t\t\ts.td.reset();\n\t\t\ts.count = 0;\n\t\t\ts.sum = 0;\n\t\t});\n\t}\n\n\t/**\n\t * Start a timer that could be used to logging durations\n\t * @param {object} labels - Object with labels where key is the label key and value is label value. Can only be one level deep\n\t * @returns {function} - Function to invoke when you want to stop the timer and observe the duration in seconds\n\t * @example\n\t * var end = summary.startTimer();\n\t * makeExpensiveXHRRequest(function(err, res) {\n\t *\tend(); //Observe the duration of expensiveXHRRequest\n\t * });\n\t */\n\tstartTimer(labels) {\n\t\treturn startTimer.call(this, labels)();\n\t}\n\n\tlabels(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\treturn {\n\t\t\tobserve: observe.call(this, labels),\n\t\t\tstartTimer: startTimer.call(this, labels),\n\t\t};\n\t}\n\n\tremove(...args) {\n\t\tconst labels = getLabels(this.labelNames, args);\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tremoveLabels.call(this, this.hashMap, labels, this.sortedLabelNames);\n\t}\n}\n\nfunction extractSummariesForExport(summaryOfLabels, percentiles) {\n\tsummaryOfLabels.td.compress();\n\n\treturn percentiles.map(percentile => {\n\t\tconst percentileValue = summaryOfLabels.td.percentile(percentile);\n\t\treturn {\n\t\t\tlabels: Object.assign({ quantile: percentile }, summaryOfLabels.labels),\n\t\t\tvalue: percentileValue ? percentileValue : 0,\n\t\t};\n\t});\n}\n\nfunction getCountForExport(value, summary) {\n\treturn {\n\t\tmetricName: `${summary.name}_count`,\n\t\tlabels: value.labels,\n\t\tvalue: value.count,\n\t};\n}\n\nfunction getSumForExport(value, summary) {\n\treturn {\n\t\tmetricName: `${summary.name}_sum`,\n\t\tlabels: value.labels,\n\t\tvalue: value.sum,\n\t};\n}\n\nfunction startTimer(startLabels) {\n\treturn () => {\n\t\tconst start = process.hrtime();\n\t\treturn endLabels => {\n\t\t\tconst delta = process.hrtime(start);\n\t\t\tconst value = delta[0] + delta[1] / 1e9;\n\t\t\tthis.observe(Object.assign({}, startLabels, endLabels), value);\n\t\t\treturn value;\n\t\t};\n\t};\n}\n\nfunction observe(labels) {\n\treturn value => {\n\t\tconst labelValuePair = convertLabelsAndValues(labels, value);\n\n\t\tvalidateLabel(this.labelNames, labels);\n\t\tif (!Number.isFinite(labelValuePair.value)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Value is not a valid number: ${util.format(labelValuePair.value)}`,\n\t\t\t);\n\t\t}\n\n\t\tconst hash = hashObject(labelValuePair.labels, this.sortedLabelNames);\n\t\tlet summaryOfLabel = this.hashMap[hash];\n\t\tif (!summaryOfLabel) {\n\t\t\tsummaryOfLabel = {\n\t\t\t\tlabels: labelValuePair.labels,\n\t\t\t\ttd: new timeWindowQuantiles(this.maxAgeSeconds, this.ageBuckets),\n\t\t\t\tcount: 0,\n\t\t\t\tsum: 0,\n\t\t\t};\n\t\t}\n\n\t\tsummaryOfLabel.td.push(labelValuePair.value);\n\t\tsummaryOfLabel.count++;\n\t\tif (summaryOfLabel.count % this.compressCount === 0) {\n\t\t\tsummaryOfLabel.td.compress();\n\t\t}\n\t\tsummaryOfLabel.sum += labelValuePair.value;\n\t\tthis.hashMap[hash] = summaryOfLabel;\n\t};\n}\n\nfunction convertLabelsAndValues(labels, value) {\n\tif (value === undefined) {\n\t\treturn {\n\t\t\tvalue: labels,\n\t\t\tlabels: {},\n\t\t};\n\t}\n\n\treturn {\n\t\tlabels,\n\t\tvalue,\n\t};\n}\n\nmodule.exports = Summary;\n","'use strict';\n\nconst url = require('url');\nconst http = require('http');\nconst https = require('https');\nconst { gzipSync } = require('zlib');\nconst { globalRegistry } = require('./registry');\n\nclass Pushgateway {\n\tconstructor(gatewayUrl, options, registry) {\n\t\tif (!registry) {\n\t\t\tregistry = globalRegistry;\n\t\t}\n\t\tthis.registry = registry;\n\t\tthis.gatewayUrl = gatewayUrl;\n\t\tconst { requireJobName, ...requestOptions } = {\n\t\t\trequireJobName: true,\n\t\t\t...options,\n\t\t};\n\t\tthis.requireJobName = requireJobName;\n\t\tthis.requestOptions = requestOptions;\n\t}\n\n\tpushAdd(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'POST', params.jobName, params.groupings);\n\t}\n\n\tpush(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'PUT', params.jobName, params.groupings);\n\t}\n\n\tdelete(params = {}) {\n\t\tif (this.requireJobName && !params.jobName) {\n\t\t\tthrow new Error('Missing jobName parameter');\n\t\t}\n\n\t\treturn useGateway.call(this, 'DELETE', params.jobName, params.groupings);\n\t}\n}\nasync function useGateway(method, job, groupings) {\n\t// `URL` first added in v6.13.0\n\t// eslint-disable-next-line node/no-deprecated-api\n\tconst gatewayUrlParsed = url.parse(this.gatewayUrl);\n\tconst gatewayUrlPath =\n\t\tgatewayUrlParsed.pathname && gatewayUrlParsed.pathname !== '/'\n\t\t\t? gatewayUrlParsed.pathname\n\t\t\t: '';\n\tconst jobPath = job\n\t\t? `/job/${encodeURIComponent(job)}${generateGroupings(groupings)}`\n\t\t: '';\n\tconst path = `${gatewayUrlPath}/metrics${jobPath}`;\n\n\t// eslint-disable-next-line node/no-deprecated-api\n\tconst target = url.resolve(this.gatewayUrl, path);\n\t// eslint-disable-next-line node/no-deprecated-api\n\tconst requestParams = url.parse(target);\n\tconst httpModule = isHttps(requestParams.href) ? https : http;\n\tconst options = Object.assign(requestParams, this.requestOptions, {\n\t\tmethod,\n\t});\n\n\treturn new Promise((resolve, reject) => {\n\t\tif (method === 'DELETE' && options.headers) {\n\t\t\tdelete options.headers['Content-Encoding'];\n\t\t}\n\t\tconst req = httpModule.request(options, resp => {\n\t\t\tlet body = '';\n\t\t\tresp.setEncoding('utf8');\n\t\t\tresp.on('data', chunk => {\n\t\t\t\tbody += chunk;\n\t\t\t});\n\t\t\tresp.on('end', () => {\n\t\t\t\tif (resp.statusCode >= 400) {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(`push failed with status ${resp.statusCode}, ${body}`),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tresolve({ resp, body });\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treq.on('error', err => {\n\t\t\treject(err);\n\t\t});\n\n\t\treq.on('timeout', () => {\n\t\t\treq.destroy(new Error('Pushgateway request timed out'));\n\t\t});\n\n\t\tif (method !== 'DELETE') {\n\t\t\tthis.registry\n\t\t\t\t.metrics()\n\t\t\t\t.then(metrics => {\n\t\t\t\t\tif (\n\t\t\t\t\t\toptions.headers &&\n\t\t\t\t\t\toptions.headers['Content-Encoding'] === 'gzip'\n\t\t\t\t\t) {\n\t\t\t\t\t\tmetrics = gzipSync(metrics);\n\t\t\t\t\t}\n\t\t\t\t\treq.write(metrics);\n\t\t\t\t\treq.end();\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t} else {\n\t\t\treq.end();\n\t\t}\n\t});\n}\n\nfunction generateGroupings(groupings) {\n\tif (!groupings) {\n\t\treturn '';\n\t}\n\treturn Object.keys(groupings)\n\t\t.map(\n\t\t\tkey =>\n\t\t\t\t`/${encodeURIComponent(key)}/${encodeURIComponent(groupings[key])}`,\n\t\t)\n\t\t.join('');\n}\n\nfunction isHttps(href) {\n\treturn href.search(/^https/) !== -1;\n}\n\nmodule.exports = Pushgateway;\n","'use strict';\n\nexports.linearBuckets = (start, width, count) => {\n\tif (count < 1) {\n\t\tthrow new Error('Linear buckets needs a positive count');\n\t}\n\n\tconst buckets = new Array(count);\n\tfor (let i = 0; i < count; i++) {\n\t\tbuckets[i] = start + i * width;\n\t}\n\treturn buckets;\n};\n\nexports.exponentialBuckets = (start, factor, count) => {\n\tif (start <= 0) {\n\t\tthrow new Error('Exponential buckets needs a positive start');\n\t}\n\tif (count < 1) {\n\t\tthrow new Error('Exponential buckets needs a positive count');\n\t}\n\tif (factor <= 1) {\n\t\tthrow new Error('Exponential buckets needs a factor greater than 1');\n\t}\n\tconst buckets = new Array(count);\n\tfor (let i = 0; i < count; i++) {\n\t\tbuckets[i] = start;\n\t\tstart *= factor;\n\t}\n\treturn buckets;\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** only globals that common to node and browsers are allowed */\n// eslint-disable-next-line node/no-unsupported-features/es-builtins\nexport const _globalThis = typeof globalThis === 'object' ? globalThis : global;\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './globalThis';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './node';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const VERSION = '1.9.0';\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { VERSION } from '../version';\n\nconst re = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(.+))?$/;\n\n/**\n * Create a function to test an API version to see if it is compatible with the provided ownVersion.\n *\n * The returned function has the following semantics:\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param ownVersion version which should be checked against\n */\nexport function _makeCompatibilityCheck(\n ownVersion: string\n): (globalVersion: string) => boolean {\n const acceptedVersions = new Set<string>([ownVersion]);\n const rejectedVersions = new Set<string>();\n\n const myVersionMatch = ownVersion.match(re);\n if (!myVersionMatch) {\n // we cannot guarantee compatibility so we always return noop\n return () => false;\n }\n\n const ownVersionParsed = {\n major: +myVersionMatch[1],\n minor: +myVersionMatch[2],\n patch: +myVersionMatch[3],\n prerelease: myVersionMatch[4],\n };\n\n // if ownVersion has a prerelease tag, versions must match exactly\n if (ownVersionParsed.prerelease != null) {\n return function isExactmatch(globalVersion: string): boolean {\n return globalVersion === ownVersion;\n };\n }\n\n function _reject(v: string) {\n rejectedVersions.add(v);\n return false;\n }\n\n function _accept(v: string) {\n acceptedVersions.add(v);\n return true;\n }\n\n return function isCompatible(globalVersion: string): boolean {\n if (acceptedVersions.has(globalVersion)) {\n return true;\n }\n\n if (rejectedVersions.has(globalVersion)) {\n return false;\n }\n\n const globalVersionMatch = globalVersion.match(re);\n if (!globalVersionMatch) {\n // cannot parse other version\n // we cannot guarantee compatibility so we always noop\n return _reject(globalVersion);\n }\n\n const globalVersionParsed = {\n major: +globalVersionMatch[1],\n minor: +globalVersionMatch[2],\n patch: +globalVersionMatch[3],\n prerelease: globalVersionMatch[4],\n };\n\n // if globalVersion has a prerelease tag, versions must match exactly\n if (globalVersionParsed.prerelease != null) {\n return _reject(globalVersion);\n }\n\n // major versions must match\n if (ownVersionParsed.major !== globalVersionParsed.major) {\n return _reject(globalVersion);\n }\n\n if (ownVersionParsed.major === 0) {\n if (\n ownVersionParsed.minor === globalVersionParsed.minor &&\n ownVersionParsed.patch <= globalVersionParsed.patch\n ) {\n return _accept(globalVersion);\n }\n\n return _reject(globalVersion);\n }\n\n if (ownVersionParsed.minor <= globalVersionParsed.minor) {\n return _accept(globalVersion);\n }\n\n return _reject(globalVersion);\n };\n}\n\n/**\n * Test an API version to see if it is compatible with this API.\n *\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param version version of the API requesting an instance of the global API\n */\nexport const isCompatible = _makeCompatibilityCheck(VERSION);\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MeterProvider } from '../metrics/MeterProvider';\nimport { ContextManager } from '../context/types';\nimport { DiagLogger } from '../diag/types';\nimport { _globalThis } from '../platform';\nimport { TextMapPropagator } from '../propagation/TextMapPropagator';\nimport type { TracerProvider } from '../trace/tracer_provider';\nimport { VERSION } from '../version';\nimport { isCompatible } from './semver';\n\nconst major = VERSION.split('.')[0];\nconst GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for(\n `opentelemetry.js.api.${major}`\n);\n\nconst _global = _globalThis as OTelGlobal;\n\nexport function registerGlobal<Type extends keyof OTelGlobalAPI>(\n type: Type,\n instance: OTelGlobalAPI[Type],\n diag: DiagLogger,\n allowOverride = false\n): boolean {\n const api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = _global[\n GLOBAL_OPENTELEMETRY_API_KEY\n ] ?? {\n version: VERSION,\n });\n\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(\n `@opentelemetry/api: Attempted duplicate registration of API: ${type}`\n );\n diag.error(err.stack || err.message);\n return false;\n }\n\n if (api.version !== VERSION) {\n // All registered APIs must be of the same version exactly\n const err = new Error(\n `@opentelemetry/api: Registration of version v${api.version} for ${type} does not match previously registered API v${VERSION}`\n );\n diag.error(err.stack || err.message);\n return false;\n }\n\n api[type] = instance;\n diag.debug(\n `@opentelemetry/api: Registered a global for ${type} v${VERSION}.`\n );\n\n return true;\n}\n\nexport function getGlobal<Type extends keyof OTelGlobalAPI>(\n type: Type\n): OTelGlobalAPI[Type] | undefined {\n const globalVersion = _global[GLOBAL_OPENTELEMETRY_API_KEY]?.version;\n if (!globalVersion || !isCompatible(globalVersion)) {\n return;\n }\n return _global[GLOBAL_OPENTELEMETRY_API_KEY]?.[type];\n}\n\nexport function unregisterGlobal(type: keyof OTelGlobalAPI, diag: DiagLogger) {\n diag.debug(\n `@opentelemetry/api: Unregistering a global for ${type} v${VERSION}.`\n );\n const api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n\n if (api) {\n delete api[type];\n }\n}\n\ntype OTelGlobal = {\n [GLOBAL_OPENTELEMETRY_API_KEY]?: OTelGlobalAPI;\n};\n\ntype OTelGlobalAPI = {\n version: string;\n\n diag?: DiagLogger;\n trace?: TracerProvider;\n context?: ContextManager;\n metrics?: MeterProvider;\n propagation?: TextMapPropagator;\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getGlobal } from '../internal/global-utils';\nimport { ComponentLoggerOptions, DiagLogger, DiagLogFunction } from './types';\n\n/**\n * Component Logger which is meant to be used as part of any component which\n * will add automatically additional namespace in front of the log message.\n * It will then forward all message to global diag logger\n * @example\n * const cLogger = diag.createComponentLogger({ namespace: '@opentelemetry/instrumentation-http' });\n * cLogger.debug('test');\n * // @opentelemetry/instrumentation-http test\n */\nexport class DiagComponentLogger implements DiagLogger {\n private _namespace: string;\n\n constructor(props: ComponentLoggerOptions) {\n this._namespace = props.namespace || 'DiagComponentLogger';\n }\n\n public debug(...args: any[]): void {\n return logProxy('debug', this._namespace, args);\n }\n\n public error(...args: any[]): void {\n return logProxy('error', this._namespace, args);\n }\n\n public info(...args: any[]): void {\n return logProxy('info', this._namespace, args);\n }\n\n public warn(...args: any[]): void {\n return logProxy('warn', this._namespace, args);\n }\n\n public verbose(...args: any[]): void {\n return logProxy('verbose', this._namespace, args);\n }\n}\n\nfunction logProxy(\n funcName: keyof DiagLogger,\n namespace: string,\n args: any\n): void {\n const logger = getGlobal('diag');\n // shortcut if logger not set\n if (!logger) {\n return;\n }\n\n args.unshift(namespace);\n return logger[funcName](...(args as Parameters<DiagLogFunction>));\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport type DiagLogFunction = (message: string, ...args: unknown[]) => void;\n\n/**\n * Defines an internal diagnostic logger interface which is used to log internal diagnostic\n * messages, you can set the default diagnostic logger via the {@link DiagAPI} setLogger function.\n * API provided implementations include :-\n * - a No-Op {@link createNoopDiagLogger}\n * - a {@link DiagLogLevel} filtering wrapper {@link createLogLevelDiagLogger}\n * - a general Console {@link DiagConsoleLogger} version.\n */\nexport interface DiagLogger {\n /** Log an error scenario that was not expected and caused the requested operation to fail. */\n error: DiagLogFunction;\n\n /**\n * Log a warning scenario to inform the developer of an issues that should be investigated.\n * The requested operation may or may not have succeeded or completed.\n */\n warn: DiagLogFunction;\n\n /**\n * Log a general informational message, this should not affect functionality.\n * This is also the default logging level so this should NOT be used for logging\n * debugging level information.\n */\n info: DiagLogFunction;\n\n /**\n * Log a general debug message that can be useful for identifying a failure.\n * Information logged at this level may include diagnostic details that would\n * help identify a failure scenario.\n * For example: Logging the order of execution of async operations.\n */\n debug: DiagLogFunction;\n\n /**\n * Log a detailed (verbose) trace level logging that can be used to identify failures\n * where debug level logging would be insufficient, this level of tracing can include\n * input and output parameters and as such may include PII information passing through\n * the API. As such it is recommended that this level of tracing should not be enabled\n * in a production environment.\n */\n verbose: DiagLogFunction;\n}\n\n/**\n * Defines the available internal logging levels for the diagnostic logger, the numeric values\n * of the levels are defined to match the original values from the initial LogLevel to avoid\n * compatibility/migration issues for any implementation that assume the numeric ordering.\n */\nexport enum DiagLogLevel {\n /** Diagnostic Logging level setting to disable all logging (except and forced logs) */\n NONE = 0,\n\n /** Identifies an error scenario */\n ERROR = 30,\n\n /** Identifies a warning scenario */\n WARN = 50,\n\n /** General informational log message */\n INFO = 60,\n\n /** General debug log message */\n DEBUG = 70,\n\n /**\n * Detailed trace level logging should only be used for development, should only be set\n * in a development environment.\n */\n VERBOSE = 80,\n\n /** Used to set the logging level to include all logging */\n ALL = 9999,\n}\n\n/**\n * Defines options for ComponentLogger\n */\nexport interface ComponentLoggerOptions {\n namespace: string;\n}\n\nexport interface DiagLoggerOptions {\n /**\n * The {@link DiagLogLevel} used to filter logs sent to the logger.\n *\n * @defaultValue DiagLogLevel.INFO\n */\n logLevel?: DiagLogLevel;\n\n /**\n * Setting this value to `true` will suppress the warning message normally emitted when registering a logger when another logger is already registered.\n */\n suppressOverrideMessage?: boolean;\n}\n\nexport interface DiagLoggerApi {\n /**\n * Set the global DiagLogger and DiagLogLevel.\n * If a global diag logger is already set, this will override it.\n *\n * @param logger - The {@link DiagLogger} instance to set as the default logger.\n * @param options - A {@link DiagLoggerOptions} object. If not provided, default values will be set.\n * @returns `true` if the logger was successfully registered, else `false`\n */\n setLogger(logger: DiagLogger, options?: DiagLoggerOptions): boolean;\n\n /**\n *\n * @param logger - The {@link DiagLogger} instance to set as the default logger.\n * @param logLevel - The {@link DiagLogLevel} used to filter logs sent to the logger. If not provided it will default to {@link DiagLogLevel.INFO}.\n * @returns `true` if the logger was successfully registered, else `false`\n */\n setLogger(logger: DiagLogger, logLevel?: DiagLogLevel): boolean;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagLogFunction, DiagLogger, DiagLogLevel } from '../types';\n\nexport function createLogLevelDiagLogger(\n maxLevel: DiagLogLevel,\n logger: DiagLogger\n): DiagLogger {\n if (maxLevel < DiagLogLevel.NONE) {\n maxLevel = DiagLogLevel.NONE;\n } else if (maxLevel > DiagLogLevel.ALL) {\n maxLevel = DiagLogLevel.ALL;\n }\n\n // In case the logger is null or undefined\n logger = logger || {};\n\n function _filterFunc(\n funcName: keyof DiagLogger,\n theLevel: DiagLogLevel\n ): DiagLogFunction {\n const theFunc = logger[funcName];\n\n if (typeof theFunc === 'function' && maxLevel >= theLevel) {\n return theFunc.bind(logger);\n }\n return function () {};\n }\n\n return {\n error: _filterFunc('error', DiagLogLevel.ERROR),\n warn: _filterFunc('warn', DiagLogLevel.WARN),\n info: _filterFunc('info', DiagLogLevel.INFO),\n debug: _filterFunc('debug', DiagLogLevel.DEBUG),\n verbose: _filterFunc('verbose', DiagLogLevel.VERBOSE),\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagComponentLogger } from '../diag/ComponentLogger';\nimport { createLogLevelDiagLogger } from '../diag/internal/logLevelLogger';\nimport {\n ComponentLoggerOptions,\n DiagLogFunction,\n DiagLogger,\n DiagLoggerApi,\n DiagLogLevel,\n} from '../diag/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\n\nconst API_NAME = 'diag';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry internal\n * diagnostic API\n */\nexport class DiagAPI implements DiagLogger, DiagLoggerApi {\n private static _instance?: DiagAPI;\n\n /** Get the singleton instance of the DiagAPI API */\n public static instance(): DiagAPI {\n if (!this._instance) {\n this._instance = new DiagAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Private internal constructor\n * @private\n */\n private constructor() {\n function _logProxy(funcName: keyof DiagLogger): DiagLogFunction {\n return function (...args) {\n const logger = getGlobal('diag');\n // shortcut if logger not set\n if (!logger) return;\n return logger[funcName](...args);\n };\n }\n\n // Using self local variable for minification purposes as 'this' cannot be minified\n const self = this;\n\n // DiagAPI specific functions\n\n const setLogger: DiagLoggerApi['setLogger'] = (\n logger,\n optionsOrLogLevel = { logLevel: DiagLogLevel.INFO }\n ) => {\n if (logger === self) {\n // There isn't much we can do here.\n // Logging to the console might break the user application.\n // Try to log to self. If a logger was previously registered it will receive the log.\n const err = new Error(\n 'Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation'\n );\n self.error(err.stack ?? err.message);\n return false;\n }\n\n if (typeof optionsOrLogLevel === 'number') {\n optionsOrLogLevel = {\n logLevel: optionsOrLogLevel,\n };\n }\n\n const oldLogger = getGlobal('diag');\n const newLogger = createLogLevelDiagLogger(\n optionsOrLogLevel.logLevel ?? DiagLogLevel.INFO,\n logger\n );\n // There already is an logger registered. We'll let it know before overwriting it.\n if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {\n const stack = new Error().stack ?? '<failed to generate stacktrace>';\n oldLogger.warn(`Current logger will be overwritten from ${stack}`);\n newLogger.warn(\n `Current logger will overwrite one already registered from ${stack}`\n );\n }\n\n return registerGlobal('diag', newLogger, self, true);\n };\n\n self.setLogger = setLogger;\n\n self.disable = () => {\n unregisterGlobal(API_NAME, self);\n };\n\n self.createComponentLogger = (options: ComponentLoggerOptions) => {\n return new DiagComponentLogger(options);\n };\n\n self.verbose = _logProxy('verbose');\n self.debug = _logProxy('debug');\n self.info = _logProxy('info');\n self.warn = _logProxy('warn');\n self.error = _logProxy('error');\n }\n\n public setLogger!: DiagLoggerApi['setLogger'];\n /**\n *\n */\n public createComponentLogger!: (\n options: ComponentLoggerOptions\n ) => DiagLogger;\n\n // DiagLogger implementation\n public verbose!: DiagLogFunction;\n public debug!: DiagLogFunction;\n public info!: DiagLogFunction;\n public warn!: DiagLogFunction;\n public error!: DiagLogFunction;\n\n /**\n * Unregister the global logger and return to Noop\n */\n public disable!: () => void;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Baggage, BaggageEntry } from '../types';\n\nexport class BaggageImpl implements Baggage {\n private _entries: Map<string, BaggageEntry>;\n\n constructor(entries?: Map<string, BaggageEntry>) {\n this._entries = entries ? new Map(entries) : new Map();\n }\n\n getEntry(key: string): BaggageEntry | undefined {\n const entry = this._entries.get(key);\n if (!entry) {\n return undefined;\n }\n\n return Object.assign({}, entry);\n }\n\n getAllEntries(): [string, BaggageEntry][] {\n return Array.from(this._entries.entries()).map(([k, v]) => [k, v]);\n }\n\n setEntry(key: string, entry: BaggageEntry): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.set(key, entry);\n return newBaggage;\n }\n\n removeEntry(key: string): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.delete(key);\n return newBaggage;\n }\n\n removeEntries(...keys: string[]): BaggageImpl {\n const newBaggage = new BaggageImpl(this._entries);\n for (const key of keys) {\n newBaggage._entries.delete(key);\n }\n return newBaggage;\n }\n\n clear(): BaggageImpl {\n return new BaggageImpl();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Symbol used to make BaggageEntryMetadata an opaque type\n */\nexport const baggageEntryMetadataSymbol = Symbol('BaggageEntryMetadata');\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagAPI } from '../api/diag';\nimport { BaggageImpl } from './internal/baggage-impl';\nimport { baggageEntryMetadataSymbol } from './internal/symbol';\nimport { Baggage, BaggageEntry, BaggageEntryMetadata } from './types';\n\nconst diag = DiagAPI.instance();\n\n/**\n * Create a new Baggage with optional entries\n *\n * @param entries An array of baggage entries the new baggage should contain\n */\nexport function createBaggage(\n entries: Record<string, BaggageEntry> = {}\n): Baggage {\n return new BaggageImpl(new Map(Object.entries(entries)));\n}\n\n/**\n * Create a serializable BaggageEntryMetadata object from a string.\n *\n * @param str string metadata. Format is currently not defined by the spec and has no special meaning.\n *\n */\nexport function baggageEntryMetadataFromString(\n str: string\n): BaggageEntryMetadata {\n if (typeof str !== 'string') {\n diag.error(\n `Cannot create baggage metadata from unknown type: ${typeof str}`\n );\n str = '';\n }\n\n return {\n __TYPE__: baggageEntryMetadataSymbol,\n toString() {\n return str;\n },\n };\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from './types';\n\n/** Get a key to uniquely identify a context value */\nexport function createContextKey(description: string) {\n // The specification states that for the same input, multiple calls should\n // return different keys. Due to the nature of the JS dependency management\n // system, this creates problems where multiple versions of some package\n // could hold different keys for the same property.\n //\n // Therefore, we use Symbol.for which returns the same key for the same input.\n return Symbol.for(description);\n}\n\nclass BaseContext implements Context {\n private _currentContext!: Map<symbol, unknown>;\n\n /**\n * Construct a new context which inherits values from an optional parent context.\n *\n * @param parentContext a context from which to inherit values\n */\n constructor(parentContext?: Map<symbol, unknown>) {\n // for minification\n const self = this;\n\n self._currentContext = parentContext ? new Map(parentContext) : new Map();\n\n self.getValue = (key: symbol) => self._currentContext.get(key);\n\n self.setValue = (key: symbol, value: unknown): Context => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.set(key, value);\n return context;\n };\n\n self.deleteValue = (key: symbol): Context => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.delete(key);\n return context;\n };\n }\n\n /**\n * Get a value from the context.\n *\n * @param key key which identifies a context value\n */\n public getValue!: (key: symbol) => unknown;\n\n /**\n * Create a new context which inherits from this context and has\n * the given key set to the given value.\n *\n * @param key context key for which to set the value\n * @param value value to set for the given key\n */\n public setValue!: (key: symbol, value: unknown) => Context;\n\n /**\n * Return a new context which inherits from this context but does\n * not contain a value for the given key.\n *\n * @param key context key for which to clear a value\n */\n public deleteValue!: (key: symbol) => Context;\n}\n\n/** The root context is used as the default parent context when there is no active context */\nexport const ROOT_CONTEXT: Context = new BaseContext();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiagLogger, DiagLogFunction } from './types';\n\ntype ConsoleMapKeys = 'error' | 'warn' | 'info' | 'debug' | 'trace';\nconst consoleMap: { n: keyof DiagLogger; c: ConsoleMapKeys }[] = [\n { n: 'error', c: 'error' },\n { n: 'warn', c: 'warn' },\n { n: 'info', c: 'info' },\n { n: 'debug', c: 'debug' },\n { n: 'verbose', c: 'trace' },\n];\n\n/**\n * A simple Immutable Console based diagnostic logger which will output any messages to the Console.\n * If you want to limit the amount of logging to a specific level or lower use the\n * {@link createLogLevelDiagLogger}\n */\nexport class DiagConsoleLogger implements DiagLogger {\n constructor() {\n function _consoleFunc(funcName: ConsoleMapKeys): DiagLogFunction {\n return function (...args) {\n if (console) {\n // Some environments only expose the console when the F12 developer console is open\n // eslint-disable-next-line no-console\n let theFunc = console[funcName];\n if (typeof theFunc !== 'function') {\n // Not all environments support all functions\n // eslint-disable-next-line no-console\n theFunc = console.log;\n }\n\n // One last final check\n if (typeof theFunc === 'function') {\n return theFunc.apply(console, args);\n }\n }\n };\n }\n\n for (let i = 0; i < consoleMap.length; i++) {\n this[consoleMap[i].n] = _consoleFunc(consoleMap[i].c);\n }\n }\n\n /** Log an error scenario that was not expected and caused the requested operation to fail. */\n public error!: DiagLogFunction;\n\n /**\n * Log a warning scenario to inform the developer of an issues that should be investigated.\n * The requested operation may or may not have succeeded or completed.\n */\n public warn!: DiagLogFunction;\n\n /**\n * Log a general informational message, this should not affect functionality.\n * This is also the default logging level so this should NOT be used for logging\n * debugging level information.\n */\n public info!: DiagLogFunction;\n\n /**\n * Log a general debug message that can be useful for identifying a failure.\n * Information logged at this level may include diagnostic details that would\n * help identify a failure scenario. Useful scenarios would be to log the execution\n * order of async operations\n */\n public debug!: DiagLogFunction;\n\n /**\n * Log a detailed (verbose) trace level logging that can be used to identify failures\n * where debug level logging would be insufficient, this level of tracing can include\n * input and output parameters and as such may include PII information passing through\n * the API. As such it is recommended that this level of tracing should not be enabled\n * in a production environment.\n */\n public verbose!: DiagLogFunction;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter } from './Meter';\nimport {\n BatchObservableCallback,\n Counter,\n Gauge,\n Histogram,\n MetricAttributes,\n MetricOptions,\n Observable,\n ObservableCallback,\n ObservableCounter,\n ObservableGauge,\n ObservableUpDownCounter,\n UpDownCounter,\n} from './Metric';\n\n/**\n * NoopMeter is a noop implementation of the {@link Meter} interface. It reuses\n * constant NoopMetrics for all of its methods.\n */\nexport class NoopMeter implements Meter {\n constructor() {}\n\n /**\n * @see {@link Meter.createGauge}\n */\n createGauge(_name: string, _options?: MetricOptions): Gauge {\n return NOOP_GAUGE_METRIC;\n }\n\n /**\n * @see {@link Meter.createHistogram}\n */\n createHistogram(_name: string, _options?: MetricOptions): Histogram {\n return NOOP_HISTOGRAM_METRIC;\n }\n\n /**\n * @see {@link Meter.createCounter}\n */\n createCounter(_name: string, _options?: MetricOptions): Counter {\n return NOOP_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createUpDownCounter}\n */\n createUpDownCounter(_name: string, _options?: MetricOptions): UpDownCounter {\n return NOOP_UP_DOWN_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableGauge}\n */\n createObservableGauge(\n _name: string,\n _options?: MetricOptions\n ): ObservableGauge {\n return NOOP_OBSERVABLE_GAUGE_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableCounter}\n */\n createObservableCounter(\n _name: string,\n _options?: MetricOptions\n ): ObservableCounter {\n return NOOP_OBSERVABLE_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.createObservableUpDownCounter}\n */\n createObservableUpDownCounter(\n _name: string,\n _options?: MetricOptions\n ): ObservableUpDownCounter {\n return NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC;\n }\n\n /**\n * @see {@link Meter.addBatchObservableCallback}\n */\n addBatchObservableCallback(\n _callback: BatchObservableCallback,\n _observables: Observable[]\n ): void {}\n\n /**\n * @see {@link Meter.removeBatchObservableCallback}\n */\n removeBatchObservableCallback(_callback: BatchObservableCallback): void {}\n}\n\nexport class NoopMetric {}\n\nexport class NoopCounterMetric extends NoopMetric implements Counter {\n add(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopUpDownCounterMetric\n extends NoopMetric\n implements UpDownCounter\n{\n add(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopGaugeMetric extends NoopMetric implements Gauge {\n record(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopHistogramMetric extends NoopMetric implements Histogram {\n record(_value: number, _attributes: MetricAttributes): void {}\n}\n\nexport class NoopObservableMetric {\n addCallback(_callback: ObservableCallback) {}\n\n removeCallback(_callback: ObservableCallback) {}\n}\n\nexport class NoopObservableCounterMetric\n extends NoopObservableMetric\n implements ObservableCounter {}\n\nexport class NoopObservableGaugeMetric\n extends NoopObservableMetric\n implements ObservableGauge {}\n\nexport class NoopObservableUpDownCounterMetric\n extends NoopObservableMetric\n implements ObservableUpDownCounter {}\n\nexport const NOOP_METER = new NoopMeter();\n\n// Synchronous instruments\nexport const NOOP_COUNTER_METRIC = new NoopCounterMetric();\nexport const NOOP_GAUGE_METRIC = new NoopGaugeMetric();\nexport const NOOP_HISTOGRAM_METRIC = new NoopHistogramMetric();\nexport const NOOP_UP_DOWN_COUNTER_METRIC = new NoopUpDownCounterMetric();\n\n// Asynchronous instruments\nexport const NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableCounterMetric();\nexport const NOOP_OBSERVABLE_GAUGE_METRIC = new NoopObservableGaugeMetric();\nexport const NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC =\n new NoopObservableUpDownCounterMetric();\n\n/**\n * Create a no-op Meter\n */\nexport function createNoopMeter(): Meter {\n return NOOP_METER;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Attributes, AttributeValue } from '../common/Attributes';\nimport { Context } from '../context/types';\nimport { BatchObservableResult, ObservableResult } from './ObservableResult';\n\n/**\n * Advisory options influencing aggregation configuration parameters.\n * @experimental\n */\nexport interface MetricAdvice {\n /**\n * Hint the explicit bucket boundaries for SDK if the metric is been\n * aggregated with a HistogramAggregator.\n */\n explicitBucketBoundaries?: number[];\n}\n\n/**\n * Options needed for metric creation\n */\nexport interface MetricOptions {\n /**\n * The description of the Metric.\n * @default ''\n */\n description?: string;\n\n /**\n * The unit of the Metric values.\n * @default ''\n */\n unit?: string;\n\n /**\n * Indicates the type of the recorded value.\n * @default {@link ValueType.DOUBLE}\n */\n valueType?: ValueType;\n\n /**\n * The advice influencing aggregation configuration parameters.\n * @experimental\n */\n advice?: MetricAdvice;\n}\n\n/** The Type of value. It describes how the data is reported. */\nexport enum ValueType {\n INT,\n DOUBLE,\n}\n\n/**\n * Counter is the most common synchronous instrument. This instrument supports\n * an `Add(increment)` function for reporting a sum, and is restricted to\n * non-negative increments. The default aggregation is Sum, as for any additive\n * instrument.\n *\n * Example uses for Counter:\n * <ol>\n * <li> count the number of bytes received. </li>\n * <li> count the number of requests completed. </li>\n * <li> count the number of accounts created. </li>\n * <li> count the number of checkpoints run. </li>\n * <li> count the number of 5xx errors. </li>\n * <ol>\n */\nexport interface Counter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Increment value of counter by the input. Inputs must not be negative.\n */\n add(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface UpDownCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Increment value of counter by the input. Inputs may be negative.\n */\n add(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface Gauge<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Records a measurement.\n */\n record(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\nexport interface Histogram<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Records a measurement. Value of the measurement must not be negative.\n */\n record(value: number, attributes?: AttributesTypes, context?: Context): void;\n}\n\n/**\n * @deprecated please use {@link Attributes}\n */\nexport type MetricAttributes = Attributes;\n\n/**\n * @deprecated please use {@link AttributeValue}\n */\nexport type MetricAttributeValue = AttributeValue;\n\n/**\n * The observable callback for Observable instruments.\n */\nexport type ObservableCallback<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = (\n observableResult: ObservableResult<AttributesTypes>\n) => void | Promise<void>;\n\n/**\n * The observable callback for a batch of Observable instruments.\n */\nexport type BatchObservableCallback<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = (\n observableResult: BatchObservableResult<AttributesTypes>\n) => void | Promise<void>;\n\nexport interface Observable<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> {\n /**\n * Sets up a function that will be called whenever a metric collection is initiated.\n *\n * If the function is already in the list of callbacks for this Observable, the function is not added a second time.\n */\n addCallback(callback: ObservableCallback<AttributesTypes>): void;\n\n /**\n * Removes a callback previously registered with {@link Observable.addCallback}.\n */\n removeCallback(callback: ObservableCallback<AttributesTypes>): void;\n}\n\nexport type ObservableCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\nexport type ObservableUpDownCounter<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\nexport type ObservableGauge<\n AttributesTypes extends MetricAttributes = MetricAttributes,\n> = Observable<AttributesTypes>;\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\n\n/**\n * Injects `Context` into and extracts it from carriers that travel\n * in-band across process boundaries. Encoding is expected to conform to the\n * HTTP Header Field semantics. Values are often encoded as RPC/HTTP request\n * headers.\n *\n * The carrier of propagated data on both the client (injector) and server\n * (extractor) side is usually an object such as http headers. Propagation is\n * usually implemented via library-specific request interceptors, where the\n * client-side injects values and the server-side extracts them.\n */\nexport interface TextMapPropagator<Carrier = any> {\n /**\n * Injects values from a given `Context` into a carrier.\n *\n * OpenTelemetry defines a common set of format values (TextMapPropagator),\n * and each has an expected `carrier` type.\n *\n * @param context the Context from which to extract values to transmit over\n * the wire.\n * @param carrier the carrier of propagation fields, such as http request\n * headers.\n * @param setter an optional {@link TextMapSetter}. If undefined, values will be\n * set by direct object assignment.\n */\n inject(\n context: Context,\n carrier: Carrier,\n setter: TextMapSetter<Carrier>\n ): void;\n\n /**\n * Given a `Context` and a carrier, extract context values from a\n * carrier and return a new context, created from the old context, with the\n * extracted values.\n *\n * @param context the Context from which to extract values to transmit over\n * the wire.\n * @param carrier the carrier of propagation fields, such as http request\n * headers.\n * @param getter an optional {@link TextMapGetter}. If undefined, keys will be all\n * own properties, and keys will be accessed by direct object access.\n */\n extract(\n context: Context,\n carrier: Carrier,\n getter: TextMapGetter<Carrier>\n ): Context;\n\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n fields(): string[];\n}\n\n/**\n * A setter is specified by the caller to define a specific method\n * to set key/value pairs on the carrier within a propagator.\n */\nexport interface TextMapSetter<Carrier = any> {\n /**\n * Callback used to set a key/value pair on an object.\n *\n * Should be called by the propagator each time a key/value pair\n * should be set, and should set that key/value pair on the propagator.\n *\n * @param carrier object or class which carries key/value pairs\n * @param key string key to modify\n * @param value value to be set to the key on the carrier\n */\n set(carrier: Carrier, key: string, value: string): void;\n}\n\n/**\n * A getter is specified by the caller to define a specific method\n * to get the value of a key from a carrier.\n */\nexport interface TextMapGetter<Carrier = any> {\n /**\n * Get a list of all keys available on the carrier.\n *\n * @param carrier\n */\n keys(carrier: Carrier): string[];\n\n /**\n * Get the value of a specific key from the carrier.\n *\n * @param carrier\n * @param key\n */\n get(carrier: Carrier, key: string): undefined | string | string[];\n}\n\nexport const defaultTextMapGetter: TextMapGetter = {\n get(carrier, key) {\n if (carrier == null) {\n return undefined;\n }\n return carrier[key];\n },\n\n keys(carrier) {\n if (carrier == null) {\n return [];\n }\n return Object.keys(carrier);\n },\n};\n\nexport const defaultTextMapSetter: TextMapSetter = {\n set(carrier, key, value) {\n if (carrier == null) {\n return;\n }\n\n carrier[key] = value;\n },\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ROOT_CONTEXT } from './context';\nimport * as types from './types';\n\nexport class NoopContextManager implements types.ContextManager {\n active(): types.Context {\n return ROOT_CONTEXT;\n }\n\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n _context: types.Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n return fn.call(thisArg, ...args);\n }\n\n bind<T>(_context: types.Context, target: T): T {\n return target;\n }\n\n enable(): this {\n return this;\n }\n\n disable(): this {\n return this;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NoopContextManager } from '../context/NoopContextManager';\nimport { Context, ContextManager } from '../context/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'context';\nconst NOOP_CONTEXT_MANAGER = new NoopContextManager();\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Context API\n */\nexport class ContextAPI {\n private static _instance?: ContextAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Context API */\n public static getInstance(): ContextAPI {\n if (!this._instance) {\n this._instance = new ContextAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current context manager.\n *\n * @returns true if the context manager was successfully registered, else false\n */\n public setGlobalContextManager(contextManager: ContextManager): boolean {\n return registerGlobal(API_NAME, contextManager, DiagAPI.instance());\n }\n\n /**\n * Get the currently active context\n */\n public active(): Context {\n return this._getContextManager().active();\n }\n\n /**\n * Execute a function with an active context\n *\n * @param context context to be active during function execution\n * @param fn function to execute in a context\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n public with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n return this._getContextManager().with(context, fn, thisArg, ...args);\n }\n\n /**\n * Bind a context to a target function or event emitter\n *\n * @param context context to bind to the event emitter or function. Defaults to the currently active context\n * @param target function or event emitter to bind\n */\n public bind<T>(context: Context, target: T): T {\n return this._getContextManager().bind(context, target);\n }\n\n private _getContextManager(): ContextManager {\n return getGlobal(API_NAME) || NOOP_CONTEXT_MANAGER;\n }\n\n /** Disable and remove the global context manager */\n public disable() {\n this._getContextManager().disable();\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport enum TraceFlags {\n /** Represents no flag set. */\n NONE = 0x0,\n /** Bit to represent whether trace is sampled in trace flags. */\n SAMPLED = 0x1 << 0,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SpanContext } from './span_context';\nimport { TraceFlags } from './trace_flags';\n\nexport const INVALID_SPANID = '0000000000000000';\nexport const INVALID_TRACEID = '00000000000000000000000000000000';\nexport const INVALID_SPAN_CONTEXT: SpanContext = {\n traceId: INVALID_TRACEID,\n spanId: INVALID_SPANID,\n traceFlags: TraceFlags.NONE,\n};\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Exception } from '../common/Exception';\nimport { TimeInput } from '../common/Time';\nimport { SpanAttributes } from './attributes';\nimport { INVALID_SPAN_CONTEXT } from './invalid-span-constants';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\nimport { SpanStatus } from './status';\nimport { Link } from './link';\n\n/**\n * The NonRecordingSpan is the default {@link Span} that is used when no Span\n * implementation is available. All operations are no-op including context\n * propagation.\n */\nexport class NonRecordingSpan implements Span {\n constructor(\n private readonly _spanContext: SpanContext = INVALID_SPAN_CONTEXT\n ) {}\n\n // Returns a SpanContext.\n spanContext(): SpanContext {\n return this._spanContext;\n }\n\n // By default does nothing\n setAttribute(_key: string, _value: unknown): this {\n return this;\n }\n\n // By default does nothing\n setAttributes(_attributes: SpanAttributes): this {\n return this;\n }\n\n // By default does nothing\n addEvent(_name: string, _attributes?: SpanAttributes): this {\n return this;\n }\n\n addLink(_link: Link): this {\n return this;\n }\n\n addLinks(_links: Link[]): this {\n return this;\n }\n\n // By default does nothing\n setStatus(_status: SpanStatus): this {\n return this;\n }\n\n // By default does nothing\n updateName(_name: string): this {\n return this;\n }\n\n // By default does nothing\n end(_endTime?: TimeInput): void {}\n\n // isRecording always returns false for NonRecordingSpan.\n isRecording(): boolean {\n return false;\n }\n\n // By default does nothing\n recordException(_exception: Exception, _time?: TimeInput): void {}\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createContextKey } from '../context/context';\nimport { Context } from '../context/types';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { ContextAPI } from '../api/context';\n\n/**\n * span key\n */\nconst SPAN_KEY = createContextKey('OpenTelemetry Context Key SPAN');\n\n/**\n * Return the span if one exists\n *\n * @param context context to get span from\n */\nexport function getSpan(context: Context): Span | undefined {\n return (context.getValue(SPAN_KEY) as Span) || undefined;\n}\n\n/**\n * Gets the span from the current context, if one exists.\n */\nexport function getActiveSpan(): Span | undefined {\n return getSpan(ContextAPI.getInstance().active());\n}\n\n/**\n * Set the span on a context\n *\n * @param context context to use as parent\n * @param span span to set active\n */\nexport function setSpan(context: Context, span: Span): Context {\n return context.setValue(SPAN_KEY, span);\n}\n\n/**\n * Remove current span stored in the context\n *\n * @param context context to delete span from\n */\nexport function deleteSpan(context: Context): Context {\n return context.deleteValue(SPAN_KEY);\n}\n\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context context to set active span on\n * @param spanContext span context to be wrapped\n */\nexport function setSpanContext(\n context: Context,\n spanContext: SpanContext\n): Context {\n return setSpan(context, new NonRecordingSpan(spanContext));\n}\n\n/**\n * Get the span context of the span if it exists.\n *\n * @param context context to get values from\n */\nexport function getSpanContext(context: Context): SpanContext | undefined {\n return getSpan(context)?.spanContext();\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { INVALID_SPANID, INVALID_TRACEID } from './invalid-span-constants';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { Span } from './span';\nimport { SpanContext } from './span_context';\n\nconst VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i;\nconst VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i;\n\nexport function isValidTraceId(traceId: string): boolean {\n return VALID_TRACEID_REGEX.test(traceId) && traceId !== INVALID_TRACEID;\n}\n\nexport function isValidSpanId(spanId: string): boolean {\n return VALID_SPANID_REGEX.test(spanId) && spanId !== INVALID_SPANID;\n}\n\n/**\n * Returns true if this {@link SpanContext} is valid.\n * @return true if this {@link SpanContext} is valid.\n */\nexport function isSpanContextValid(spanContext: SpanContext): boolean {\n return (\n isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId)\n );\n}\n\n/**\n * Wrap the given {@link SpanContext} in a new non-recording {@link Span}\n *\n * @param spanContext span context to be wrapped\n * @returns a new non-recording {@link Span} with the provided context\n */\nexport function wrapSpanContext(spanContext: SpanContext): Span {\n return new NonRecordingSpan(spanContext);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ContextAPI } from '../api/context';\nimport { Context } from '../context/types';\nimport { getSpanContext, setSpan } from '../trace/context-utils';\nimport { NonRecordingSpan } from './NonRecordingSpan';\nimport { Span } from './span';\nimport { isSpanContextValid } from './spancontext-utils';\nimport { SpanOptions } from './SpanOptions';\nimport { SpanContext } from './span_context';\nimport { Tracer } from './tracer';\n\nconst contextApi = ContextAPI.getInstance();\n\n/**\n * No-op implementations of {@link Tracer}.\n */\nexport class NoopTracer implements Tracer {\n // startSpan starts a noop span.\n startSpan(\n name: string,\n options?: SpanOptions,\n context = contextApi.active()\n ): Span {\n const root = Boolean(options?.root);\n if (root) {\n return new NonRecordingSpan();\n }\n\n const parentFromContext = context && getSpanContext(context);\n\n if (\n isSpanContext(parentFromContext) &&\n isSpanContextValid(parentFromContext)\n ) {\n return new NonRecordingSpan(parentFromContext);\n } else {\n return new NonRecordingSpan();\n }\n }\n\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n opts: SpanOptions | undefined,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n opts: SpanOptions | undefined,\n ctx: Context | undefined,\n fn: F\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n arg2?: F | SpanOptions,\n arg3?: F | Context,\n arg4?: F\n ): ReturnType<F> | undefined {\n let opts: SpanOptions | undefined;\n let ctx: Context | undefined;\n let fn: F;\n\n if (arguments.length < 2) {\n return;\n } else if (arguments.length === 2) {\n fn = arg2 as F;\n } else if (arguments.length === 3) {\n opts = arg2 as SpanOptions | undefined;\n fn = arg3 as F;\n } else {\n opts = arg2 as SpanOptions | undefined;\n ctx = arg3 as Context | undefined;\n fn = arg4 as F;\n }\n\n const parentContext = ctx ?? contextApi.active();\n const span = this.startSpan(name, opts, parentContext);\n const contextWithSpanSet = setSpan(parentContext, span);\n\n return contextApi.with(contextWithSpanSet, fn, undefined, span);\n }\n}\n\nfunction isSpanContext(spanContext: any): spanContext is SpanContext {\n return (\n typeof spanContext === 'object' &&\n typeof spanContext['spanId'] === 'string' &&\n typeof spanContext['traceId'] === 'string' &&\n typeof spanContext['traceFlags'] === 'number'\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport { NoopTracer } from './NoopTracer';\nimport { Span } from './span';\nimport { SpanOptions } from './SpanOptions';\nimport { Tracer } from './tracer';\nimport { TracerOptions } from './tracer_options';\n\nconst NOOP_TRACER = new NoopTracer();\n\n/**\n * Proxy tracer provided by the proxy tracer provider\n */\nexport class ProxyTracer implements Tracer {\n // When a real implementation is provided, this will be it\n private _delegate?: Tracer;\n\n constructor(\n private _provider: TracerDelegator,\n public readonly name: string,\n public readonly version?: string,\n public readonly options?: TracerOptions\n ) {}\n\n startSpan(name: string, options?: SpanOptions, context?: Context): Span {\n return this._getTracer().startSpan(name, options, context);\n }\n\n startActiveSpan<F extends (span: Span) => unknown>(\n _name: string,\n _options: F | SpanOptions,\n _context?: F | Context,\n _fn?: F\n ): ReturnType<F> {\n const tracer = this._getTracer();\n return Reflect.apply(tracer.startActiveSpan, tracer, arguments);\n }\n\n /**\n * Try to get a tracer from the proxy tracer provider.\n * If the proxy tracer provider has no delegate, return a noop tracer.\n */\n private _getTracer() {\n if (this._delegate) {\n return this._delegate;\n }\n\n const tracer = this._provider.getDelegateTracer(\n this.name,\n this.version,\n this.options\n );\n\n if (!tracer) {\n return NOOP_TRACER;\n }\n\n this._delegate = tracer;\n return this._delegate;\n }\n}\n\nexport interface TracerDelegator {\n getDelegateTracer(\n name: string,\n version?: string,\n options?: TracerOptions\n ): Tracer | undefined;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NoopTracer } from './NoopTracer';\nimport { Tracer } from './tracer';\nimport { TracerOptions } from './tracer_options';\nimport { TracerProvider } from './tracer_provider';\n\n/**\n * An implementation of the {@link TracerProvider} which returns an impotent\n * Tracer for all calls to `getTracer`.\n *\n * All operations are no-op.\n */\nexport class NoopTracerProvider implements TracerProvider {\n getTracer(\n _name?: string,\n _version?: string,\n _options?: TracerOptions\n ): Tracer {\n return new NoopTracer();\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Tracer } from './tracer';\nimport { TracerProvider } from './tracer_provider';\nimport { ProxyTracer } from './ProxyTracer';\nimport { NoopTracerProvider } from './NoopTracerProvider';\nimport { TracerOptions } from './tracer_options';\n\nconst NOOP_TRACER_PROVIDER = new NoopTracerProvider();\n\n/**\n * Tracer provider which provides {@link ProxyTracer}s.\n *\n * Before a delegate is set, tracers provided are NoOp.\n * When a delegate is set, traces are provided from the delegate.\n * When a delegate is set after tracers have already been provided,\n * all tracers already provided will use the provided delegate implementation.\n */\nexport class ProxyTracerProvider implements TracerProvider {\n private _delegate?: TracerProvider;\n\n /**\n * Get a {@link ProxyTracer}\n */\n getTracer(name: string, version?: string, options?: TracerOptions): Tracer {\n return (\n this.getDelegateTracer(name, version, options) ??\n new ProxyTracer(this, name, version, options)\n );\n }\n\n getDelegate(): TracerProvider {\n return this._delegate ?? NOOP_TRACER_PROVIDER;\n }\n\n /**\n * Set the delegate tracer provider\n */\n setDelegate(delegate: TracerProvider) {\n this._delegate = delegate;\n }\n\n getDelegateTracer(\n name: string,\n version?: string,\n options?: TracerOptions\n ): Tracer | undefined {\n return this._delegate?.getTracer(name, version, options);\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SpanAttributes } from './attributes';\nimport { TraceState } from './trace_state';\n\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling decision that determines how a {@link Span} will be recorded\n * and collected.\n */\nexport enum SamplingDecision {\n /**\n * `Span.isRecording() === false`, span will not be recorded and all events\n * and attributes will be dropped.\n */\n NOT_RECORD,\n /**\n * `Span.isRecording() === true`, but `Sampled` flag in {@link TraceFlags}\n * MUST NOT be set.\n */\n RECORD,\n /**\n * `Span.isRecording() === true` AND `Sampled` flag in {@link TraceFlags}\n * MUST be set.\n */\n RECORD_AND_SAMPLED,\n}\n\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling result contains a decision for a {@link Span} and additional\n * attributes the sampler would like to added to the Span.\n */\nexport interface SamplingResult {\n /**\n * A sampling decision, refer to {@link SamplingDecision} for details.\n */\n decision: SamplingDecision;\n /**\n * The list of attributes returned by SamplingResult MUST be immutable.\n * Caller may call {@link Sampler}.shouldSample any number of times and\n * can safely cache the returned value.\n */\n attributes?: Readonly<SpanAttributes>;\n /**\n * A {@link TraceState} that will be associated with the {@link Span} through\n * the new {@link SpanContext}. Samplers SHOULD return the TraceState from\n * the passed-in {@link Context} if they do not intend to change it. Leaving\n * the value undefined will also leave the TraceState unchanged.\n */\n traceState?: TraceState;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport enum SpanKind {\n /** Default value. Indicates that the span is used internally. */\n INTERNAL = 0,\n\n /**\n * Indicates that the span covers server-side handling of an RPC or other\n * remote request.\n */\n SERVER = 1,\n\n /**\n * Indicates that the span covers the client-side wrapper around an RPC or\n * other remote request.\n */\n CLIENT = 2,\n\n /**\n * Indicates that the span describes producer sending a message to a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n PRODUCER = 3,\n\n /**\n * Indicates that the span describes consumer receiving a message from a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n CONSUMER = 4,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport interface SpanStatus {\n /** The status code of this message. */\n code: SpanStatusCode;\n /** A developer-facing error message. */\n message?: string;\n}\n\n/**\n * An enumeration of status codes.\n */\nexport enum SpanStatusCode {\n /**\n * The default status.\n */\n UNSET = 0,\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n OK = 1,\n /**\n * The operation contains an error.\n */\n ERROR = 2,\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';\nconst VALID_KEY = `[a-z]${VALID_KEY_CHAR_RANGE}{0,255}`;\nconst VALID_VENDOR_KEY = `[a-z0-9]${VALID_KEY_CHAR_RANGE}{0,240}@[a-z]${VALID_KEY_CHAR_RANGE}{0,13}`;\nconst VALID_KEY_REGEX = new RegExp(`^(?:${VALID_KEY}|${VALID_VENDOR_KEY})$`);\nconst VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;\nconst INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;\n\n/**\n * Key is opaque string up to 256 characters printable. It MUST begin with a\n * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,\n * underscores _, dashes -, asterisks *, and forward slashes /.\n * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the\n * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.\n * see https://www.w3.org/TR/trace-context/#key\n */\nexport function validateKey(key: string): boolean {\n return VALID_KEY_REGEX.test(key);\n}\n\n/**\n * Value is opaque string up to 256 characters printable ASCII RFC0020\n * characters (i.e., the range 0x20 to 0x7E) except comma , and =.\n */\nexport function validateValue(value: string): boolean {\n return (\n VALID_VALUE_BASE_REGEX.test(value) &&\n !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value)\n );\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TraceState } from '../trace_state';\nimport { validateKey, validateValue } from './tracestate-validators';\n\nconst MAX_TRACE_STATE_ITEMS = 32;\nconst MAX_TRACE_STATE_LEN = 512;\nconst LIST_MEMBERS_SEPARATOR = ',';\nconst LIST_MEMBER_KEY_VALUE_SPLITTER = '=';\n\n/**\n * TraceState must be a class and not a simple object type because of the spec\n * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).\n *\n * Here is the list of allowed mutations:\n * - New key-value pair should be added into the beginning of the list\n * - The value of any key can be updated. Modified keys MUST be moved to the\n * beginning of the list.\n */\nexport class TraceStateImpl implements TraceState {\n private _internalState: Map<string, string> = new Map();\n\n constructor(rawTraceState?: string) {\n if (rawTraceState) this._parse(rawTraceState);\n }\n\n set(key: string, value: string): TraceStateImpl {\n // TODO: Benchmark the different approaches(map vs list) and\n // use the faster one.\n const traceState = this._clone();\n if (traceState._internalState.has(key)) {\n traceState._internalState.delete(key);\n }\n traceState._internalState.set(key, value);\n return traceState;\n }\n\n unset(key: string): TraceStateImpl {\n const traceState = this._clone();\n traceState._internalState.delete(key);\n return traceState;\n }\n\n get(key: string): string | undefined {\n return this._internalState.get(key);\n }\n\n serialize(): string {\n return this._keys()\n .reduce((agg: string[], key) => {\n agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + this.get(key));\n return agg;\n }, [])\n .join(LIST_MEMBERS_SEPARATOR);\n }\n\n private _parse(rawTraceState: string) {\n if (rawTraceState.length > MAX_TRACE_STATE_LEN) return;\n this._internalState = rawTraceState\n .split(LIST_MEMBERS_SEPARATOR)\n .reverse() // Store in reverse so new keys (.set(...)) will be placed at the beginning\n .reduce((agg: Map<string, string>, part: string) => {\n const listMember = part.trim(); // Optional Whitespace (OWS) handling\n const i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);\n if (i !== -1) {\n const key = listMember.slice(0, i);\n const value = listMember.slice(i + 1, part.length);\n if (validateKey(key) && validateValue(value)) {\n agg.set(key, value);\n } else {\n // TODO: Consider to add warning log\n }\n }\n return agg;\n }, new Map());\n\n // Because of the reverse() requirement, trunc must be done after map is created\n if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {\n this._internalState = new Map(\n Array.from(this._internalState.entries())\n .reverse() // Use reverse same as original tracestate parse chain\n .slice(0, MAX_TRACE_STATE_ITEMS)\n );\n }\n }\n\n private _keys(): string[] {\n return Array.from(this._internalState.keys()).reverse();\n }\n\n private _clone(): TraceStateImpl {\n const traceState = new TraceStateImpl();\n traceState._internalState = new Map(this._internalState);\n return traceState;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TraceState } from '../trace_state';\nimport { TraceStateImpl } from './tracestate-impl';\n\nexport function createTraceState(rawTraceState?: string): TraceState {\n return new TraceStateImpl(rawTraceState);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { ContextAPI } from './api/context';\n/** Entrypoint for context API */\nexport const context = ContextAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { DiagAPI } from './api/diag';\n/**\n * Entrypoint for Diag API.\n * Defines Diagnostic handler used for internal diagnostic logging operations.\n * The default provides a Noop DiagLogger implementation which may be changed via the\n * diag.setLogger(logger: DiagLogger) function.\n */\nexport const diag = DiagAPI.instance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter, MeterOptions } from './Meter';\nimport { MeterProvider } from './MeterProvider';\nimport { NOOP_METER } from './NoopMeter';\n\n/**\n * An implementation of the {@link MeterProvider} which returns an impotent Meter\n * for all calls to `getMeter`\n */\nexport class NoopMeterProvider implements MeterProvider {\n getMeter(_name: string, _version?: string, _options?: MeterOptions): Meter {\n return NOOP_METER;\n }\n}\n\nexport const NOOP_METER_PROVIDER = new NoopMeterProvider();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Meter, MeterOptions } from '../metrics/Meter';\nimport { MeterProvider } from '../metrics/MeterProvider';\nimport { NOOP_METER_PROVIDER } from '../metrics/NoopMeterProvider';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'metrics';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Metrics API\n */\nexport class MetricsAPI {\n private static _instance?: MetricsAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Metrics API */\n public static getInstance(): MetricsAPI {\n if (!this._instance) {\n this._instance = new MetricsAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current global meter provider.\n * Returns true if the meter provider was successfully registered, else false.\n */\n public setGlobalMeterProvider(provider: MeterProvider): boolean {\n return registerGlobal(API_NAME, provider, DiagAPI.instance());\n }\n\n /**\n * Returns the global meter provider.\n */\n public getMeterProvider(): MeterProvider {\n return getGlobal(API_NAME) || NOOP_METER_PROVIDER;\n }\n\n /**\n * Returns a meter from the global meter provider.\n */\n public getMeter(\n name: string,\n version?: string,\n options?: MeterOptions\n ): Meter {\n return this.getMeterProvider().getMeter(name, version, options);\n }\n\n /** Remove the global meter provider */\n public disable(): void {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { MetricsAPI } from './api/metrics';\n/** Entrypoint for metrics API */\nexport const metrics = MetricsAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport { TextMapPropagator } from './TextMapPropagator';\n\n/**\n * No-op implementations of {@link TextMapPropagator}.\n */\nexport class NoopTextMapPropagator implements TextMapPropagator {\n /** Noop inject function does nothing */\n inject(_context: Context, _carrier: unknown): void {}\n /** Noop extract function does nothing and returns the input context */\n extract(context: Context, _carrier: unknown): Context {\n return context;\n }\n fields(): string[] {\n return [];\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ContextAPI } from '../api/context';\nimport { createContextKey } from '../context/context';\nimport { Context } from '../context/types';\nimport { Baggage } from './types';\n\n/**\n * Baggage key\n */\nconst BAGGAGE_KEY = createContextKey('OpenTelemetry Baggage Key');\n\n/**\n * Retrieve the current baggage from the given context\n *\n * @param {Context} Context that manage all context values\n * @returns {Baggage} Extracted baggage from the context\n */\nexport function getBaggage(context: Context): Baggage | undefined {\n return (context.getValue(BAGGAGE_KEY) as Baggage) || undefined;\n}\n\n/**\n * Retrieve the current baggage from the active/current context\n *\n * @returns {Baggage} Extracted baggage from the context\n */\nexport function getActiveBaggage(): Baggage | undefined {\n return getBaggage(ContextAPI.getInstance().active());\n}\n\n/**\n * Store a baggage in the given context\n *\n * @param {Context} Context that manage all context values\n * @param {Baggage} baggage that will be set in the actual context\n */\nexport function setBaggage(context: Context, baggage: Baggage): Context {\n return context.setValue(BAGGAGE_KEY, baggage);\n}\n\n/**\n * Delete the baggage stored in the given context\n *\n * @param {Context} Context that manage all context values\n */\nexport function deleteBaggage(context: Context): Context {\n return context.deleteValue(BAGGAGE_KEY);\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Context } from '../context/types';\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { NoopTextMapPropagator } from '../propagation/NoopTextMapPropagator';\nimport {\n defaultTextMapGetter,\n defaultTextMapSetter,\n TextMapGetter,\n TextMapPropagator,\n TextMapSetter,\n} from '../propagation/TextMapPropagator';\nimport {\n getBaggage,\n getActiveBaggage,\n setBaggage,\n deleteBaggage,\n} from '../baggage/context-helpers';\nimport { createBaggage } from '../baggage/utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'propagation';\nconst NOOP_TEXT_MAP_PROPAGATOR = new NoopTextMapPropagator();\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Propagation API\n */\nexport class PropagationAPI {\n private static _instance?: PropagationAPI;\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Propagator API */\n public static getInstance(): PropagationAPI {\n if (!this._instance) {\n this._instance = new PropagationAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current propagator.\n *\n * @returns true if the propagator was successfully registered, else false\n */\n public setGlobalPropagator(propagator: TextMapPropagator): boolean {\n return registerGlobal(API_NAME, propagator, DiagAPI.instance());\n }\n\n /**\n * Inject context into a carrier to be propagated inter-process\n *\n * @param context Context carrying tracing data to inject\n * @param carrier carrier to inject context into\n * @param setter Function used to set values on the carrier\n */\n public inject<Carrier>(\n context: Context,\n carrier: Carrier,\n setter: TextMapSetter<Carrier> = defaultTextMapSetter\n ): void {\n return this._getGlobalPropagator().inject(context, carrier, setter);\n }\n\n /**\n * Extract context from a carrier\n *\n * @param context Context which the newly created context will inherit from\n * @param carrier Carrier to extract context from\n * @param getter Function used to extract keys from a carrier\n */\n public extract<Carrier>(\n context: Context,\n carrier: Carrier,\n getter: TextMapGetter<Carrier> = defaultTextMapGetter\n ): Context {\n return this._getGlobalPropagator().extract(context, carrier, getter);\n }\n\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n public fields(): string[] {\n return this._getGlobalPropagator().fields();\n }\n\n /** Remove the global propagator */\n public disable() {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n }\n\n public createBaggage = createBaggage;\n\n public getBaggage = getBaggage;\n\n public getActiveBaggage = getActiveBaggage;\n\n public setBaggage = setBaggage;\n\n public deleteBaggage = deleteBaggage;\n\n private _getGlobalPropagator(): TextMapPropagator {\n return getGlobal(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;\n }\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { PropagationAPI } from './api/propagation';\n/** Entrypoint for propagation API */\nexport const propagation = PropagationAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n getGlobal,\n registerGlobal,\n unregisterGlobal,\n} from '../internal/global-utils';\nimport { ProxyTracerProvider } from '../trace/ProxyTracerProvider';\nimport {\n isSpanContextValid,\n wrapSpanContext,\n} from '../trace/spancontext-utils';\nimport { Tracer } from '../trace/tracer';\nimport { TracerProvider } from '../trace/tracer_provider';\nimport {\n deleteSpan,\n getActiveSpan,\n getSpan,\n getSpanContext,\n setSpan,\n setSpanContext,\n} from '../trace/context-utils';\nimport { DiagAPI } from './diag';\n\nconst API_NAME = 'trace';\n\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Tracing API\n */\nexport class TraceAPI {\n private static _instance?: TraceAPI;\n\n private _proxyTracerProvider = new ProxyTracerProvider();\n\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n private constructor() {}\n\n /** Get the singleton instance of the Trace API */\n public static getInstance(): TraceAPI {\n if (!this._instance) {\n this._instance = new TraceAPI();\n }\n\n return this._instance;\n }\n\n /**\n * Set the current global tracer.\n *\n * @returns true if the tracer provider was successfully registered, else false\n */\n public setGlobalTracerProvider(provider: TracerProvider): boolean {\n const success = registerGlobal(\n API_NAME,\n this._proxyTracerProvider,\n DiagAPI.instance()\n );\n if (success) {\n this._proxyTracerProvider.setDelegate(provider);\n }\n return success;\n }\n\n /**\n * Returns the global tracer provider.\n */\n public getTracerProvider(): TracerProvider {\n return getGlobal(API_NAME) || this._proxyTracerProvider;\n }\n\n /**\n * Returns a tracer from the global tracer provider.\n */\n public getTracer(name: string, version?: string): Tracer {\n return this.getTracerProvider().getTracer(name, version);\n }\n\n /** Remove the global tracer provider */\n public disable() {\n unregisterGlobal(API_NAME, DiagAPI.instance());\n this._proxyTracerProvider = new ProxyTracerProvider();\n }\n\n public wrapSpanContext = wrapSpanContext;\n\n public isSpanContextValid = isSpanContextValid;\n\n public deleteSpan = deleteSpan;\n\n public getSpan = getSpan;\n\n public getActiveSpan = getActiveSpan;\n\n public getSpanContext = getSpanContext;\n\n public setSpan = setSpan;\n\n public setSpanContext = setSpanContext;\n}\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { TraceAPI } from './api/trace';\n/** Entrypoint for trace API */\nexport const trace = TraceAPI.getInstance();\n","/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { BaggageEntry, BaggageEntryMetadata, Baggage } from './baggage/types';\nexport { baggageEntryMetadataFromString } from './baggage/utils';\nexport { Exception } from './common/Exception';\nexport { HrTime, TimeInput } from './common/Time';\nexport { Attributes, AttributeValue } from './common/Attributes';\n\n// Context APIs\nexport { createContextKey, ROOT_CONTEXT } from './context/context';\nexport { Context, ContextManager } from './context/types';\nexport type { ContextAPI } from './api/context';\n\n// Diag APIs\nexport { DiagConsoleLogger } from './diag/consoleLogger';\nexport {\n DiagLogFunction,\n DiagLogger,\n DiagLogLevel,\n ComponentLoggerOptions,\n DiagLoggerOptions,\n} from './diag/types';\nexport type { DiagAPI } from './api/diag';\n\n// Metrics APIs\nexport { createNoopMeter } from './metrics/NoopMeter';\nexport { MeterOptions, Meter } from './metrics/Meter';\nexport { MeterProvider } from './metrics/MeterProvider';\nexport {\n ValueType,\n Counter,\n Gauge,\n Histogram,\n MetricOptions,\n Observable,\n ObservableCounter,\n ObservableGauge,\n ObservableUpDownCounter,\n UpDownCounter,\n BatchObservableCallback,\n MetricAdvice,\n MetricAttributes,\n MetricAttributeValue,\n ObservableCallback,\n} from './metrics/Metric';\nexport {\n BatchObservableResult,\n ObservableResult,\n} from './metrics/ObservableResult';\nexport type { MetricsAPI } from './api/metrics';\n\n// Propagation APIs\nexport {\n TextMapPropagator,\n TextMapSetter,\n TextMapGetter,\n defaultTextMapGetter,\n defaultTextMapSetter,\n} from './propagation/TextMapPropagator';\nexport type { PropagationAPI } from './api/propagation';\n\n// Trace APIs\nexport { SpanAttributes, SpanAttributeValue } from './trace/attributes';\nexport { Link } from './trace/link';\nexport { ProxyTracer, TracerDelegator } from './trace/ProxyTracer';\nexport { ProxyTracerProvider } from './trace/ProxyTracerProvider';\nexport { Sampler } from './trace/Sampler';\nexport { SamplingDecision, SamplingResult } from './trace/SamplingResult';\nexport { SpanContext } from './trace/span_context';\nexport { SpanKind } from './trace/span_kind';\nexport { Span } from './trace/span';\nexport { SpanOptions } from './trace/SpanOptions';\nexport { SpanStatus, SpanStatusCode } from './trace/status';\nexport { TraceFlags } from './trace/trace_flags';\nexport { TraceState } from './trace/trace_state';\nexport { createTraceState } from './trace/internal/utils';\nexport { TracerProvider } from './trace/tracer_provider';\nexport { Tracer } from './trace/tracer';\nexport { TracerOptions } from './trace/tracer_options';\nexport {\n isSpanContextValid,\n isValidTraceId,\n isValidSpanId,\n} from './trace/spancontext-utils';\nexport {\n INVALID_SPANID,\n INVALID_TRACEID,\n INVALID_SPAN_CONTEXT,\n} from './trace/invalid-span-constants';\nexport type { TraceAPI } from './api/trace';\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\nimport { context } from './context-api';\nimport { diag } from './diag-api';\nimport { metrics } from './metrics-api';\nimport { propagation } from './propagation-api';\nimport { trace } from './trace-api';\n\n// Named export.\nexport { context, diag, metrics, propagation, trace };\n// Default export.\nexport default {\n context,\n diag,\n metrics,\n propagation,\n trace,\n};\n","'use strict';\n\nconst OtelApi = require('@opentelemetry/api');\nconst Counter = require('../counter');\n\nconst PROCESS_CPU_USER_SECONDS = 'process_cpu_user_seconds_total';\nconst PROCESS_CPU_SYSTEM_SECONDS = 'process_cpu_system_seconds_total';\nconst PROCESS_CPU_SECONDS = 'process_cpu_seconds_total';\n\nmodule.exports = (registry, config = {}) => {\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst exemplars = config.enableExemplars ? config.enableExemplars : false;\n\tconst labelNames = Object.keys(labels);\n\n\tlet lastCpuUsage = process.cpuUsage();\n\n\tconst cpuUserUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_USER_SECONDS,\n\t\thelp: 'Total user CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect() {\n\t\t\tconst cpuUsage = process.cpuUsage();\n\n\t\t\tconst userUsageMicros = cpuUsage.user - lastCpuUsage.user;\n\t\t\tconst systemUsageMicros = cpuUsage.system - lastCpuUsage.system;\n\n\t\t\tlastCpuUsage = cpuUsage;\n\n\t\t\tif (this.enableExemplars) {\n\t\t\t\tlet exemplarLabels = {};\n\t\t\t\tconst currentSpan = OtelApi.trace.getSpan(OtelApi.context.active());\n\t\t\t\tif (currentSpan) {\n\t\t\t\t\texemplarLabels = {\n\t\t\t\t\t\ttraceId: currentSpan.spanContext().traceId,\n\t\t\t\t\t\tspanId: currentSpan.spanContext().spanId,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcpuUserUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: userUsageMicros / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t\tcpuSystemUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: systemUsageMicros / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t\tcpuUsageCounter.inc({\n\t\t\t\t\tlabels,\n\t\t\t\t\tvalue: (userUsageMicros + systemUsageMicros) / 1e6,\n\t\t\t\t\texemplarLabels,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcpuUserUsageCounter.inc(labels, userUsageMicros / 1e6);\n\t\t\t\tcpuSystemUsageCounter.inc(labels, systemUsageMicros / 1e6);\n\t\t\t\tcpuUsageCounter.inc(\n\t\t\t\t\tlabels,\n\t\t\t\t\t(userUsageMicros + systemUsageMicros) / 1e6,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n\tconst cpuSystemUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_SYSTEM_SECONDS,\n\t\thelp: 'Total system CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst cpuUsageCounter = new Counter({\n\t\tname: namePrefix + PROCESS_CPU_SECONDS,\n\t\thelp: 'Total user and system CPU time spent in seconds.',\n\t\tenableExemplars: exemplars,\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tPROCESS_CPU_USER_SECONDS,\n\tPROCESS_CPU_SYSTEM_SECONDS,\n\tPROCESS_CPU_SECONDS,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst startInSeconds = Math.round(Date.now() / 1000 - process.uptime());\n\nconst PROCESS_START_TIME = 'process_start_time_seconds';\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_START_TIME,\n\t\thelp: 'Start time of the process since unix epoch in seconds.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\taggregator: 'omit',\n\t\tcollect() {\n\t\t\tthis.set(labels, startInSeconds);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_START_TIME];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\n\nconst values = ['VmSize', 'VmRSS', 'VmData'];\n\nconst PROCESS_RESIDENT_MEMORY = 'process_resident_memory_bytes';\nconst PROCESS_VIRTUAL_MEMORY = 'process_virtual_memory_bytes';\nconst PROCESS_HEAP = 'process_heap_bytes';\n\nfunction structureOutput(input) {\n\treturn input.split('\\n').reduce((acc, string) => {\n\t\tif (!values.some(value => string.startsWith(value))) {\n\t\t\treturn acc;\n\t\t}\n\n\t\tconst split = string.split(':');\n\n\t\t// Get the value\n\t\tlet value = split[1].trim();\n\t\t// Remove trailing ` kb`\n\t\tvalue = value.substr(0, value.length - 3);\n\t\t// Make it into a number in bytes bytes\n\t\tvalue = Number(value) * 1024;\n\n\t\tacc[split[0]] = value;\n\n\t\treturn acc;\n\t}, {});\n}\n\nmodule.exports = (registry, config = {}) => {\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tconst residentMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_RESIDENT_MEMORY,\n\t\thelp: 'Resident memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect() {\n\t\t\ttry {\n\t\t\t\t// Sync I/O is often problematic, but /proc isn't really I/O, it\n\t\t\t\t// a virtual filesystem that maps directly to in-kernel data\n\t\t\t\t// structures and never blocks.\n\t\t\t\t//\n\t\t\t\t// Node.js/libuv do this already for process.memoryUsage(), see:\n\t\t\t\t// - https://github.com/libuv/libuv/blob/a629688008694ed8022269e66826d4d6ec688b83/src/unix/linux-core.c#L506-L523\n\t\t\t\tconst stat = fs.readFileSync('/proc/self/status', 'utf8');\n\t\t\t\tconst structuredOutput = structureOutput(stat);\n\n\t\t\t\tresidentMemGauge.set(labels, structuredOutput.VmRSS);\n\t\t\t\tvirtualMemGauge.set(labels, structuredOutput.VmSize);\n\t\t\t\theapSizeMemGauge.set(labels, structuredOutput.VmData);\n\t\t\t} catch {\n\t\t\t\t// noop\n\t\t\t}\n\t\t},\n\t});\n\tconst virtualMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_VIRTUAL_MEMORY,\n\t\thelp: 'Virtual memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst heapSizeMemGauge = new Gauge({\n\t\tname: namePrefix + PROCESS_HEAP,\n\t\thelp: 'Process heap size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tPROCESS_RESIDENT_MEMORY,\n\tPROCESS_VIRTUAL_MEMORY,\n\tPROCESS_HEAP,\n];\n","'use strict';\n\n// process.memoryUsage() can throw on some platforms, see #67\nfunction safeMemoryUsage() {\n\ttry {\n\t\treturn process.memoryUsage();\n\t} catch {\n\t\treturn;\n\t}\n}\n\nmodule.exports = safeMemoryUsage;\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst linuxVariant = require('./osMemoryHeapLinux');\nconst safeMemoryUsage = require('./helpers/safeMemoryUsage');\n\nconst PROCESS_RESIDENT_MEMORY = 'process_resident_memory_bytes';\n\nfunction notLinuxVariant(registry, config = {}) {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_RESIDENT_MEMORY,\n\t\thelp: 'Resident memory size in bytes.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst memUsage = safeMemoryUsage();\n\n\t\t\t// I don't think the other things returned from `process.memoryUsage()` is relevant to a standard export\n\t\t\tif (memUsage) {\n\t\t\t\tthis.set(labels, memUsage.rss);\n\t\t\t}\n\t\t},\n\t});\n}\n\nmodule.exports = (registry, config) =>\n\tprocess.platform === 'linux'\n\t\t? linuxVariant(registry, config)\n\t\t: notLinuxVariant(registry, config);\n\nmodule.exports.metricNames =\n\tprocess.platform === 'linux'\n\t\t? linuxVariant.metricNames\n\t\t: [PROCESS_RESIDENT_MEMORY];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\nconst process = require('process');\n\nconst PROCESS_OPEN_FDS = 'process_open_fds';\n\nmodule.exports = (registry, config = {}) => {\n\tif (process.platform !== 'linux') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_OPEN_FDS,\n\t\thelp: 'Number of open file descriptors.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\ttry {\n\t\t\t\tconst fds = fs.readdirSync('/proc/self/fd');\n\t\t\t\t// Minus 1 to not count the fd that was used by readdirSync(),\n\t\t\t\t// it's now closed.\n\t\t\t\tthis.set(labels, fds.length - 1);\n\t\t\t} catch {\n\t\t\t\t// noop\n\t\t\t}\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_OPEN_FDS];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst fs = require('fs');\n\nconst PROCESS_MAX_FDS = 'process_max_fds';\n\nlet maxFds;\n\nmodule.exports = (registry, config = {}) => {\n\tif (maxFds === undefined) {\n\t\t// This will fail if a linux-like procfs is not available.\n\t\ttry {\n\t\t\tconst limits = fs.readFileSync('/proc/self/limits', 'utf8');\n\t\t\tconst lines = limits.split('\\n');\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (line.startsWith('Max open files')) {\n\t\t\t\t\tconst parts = line.split(/ +/);\n\t\t\t\t\tmaxFds = Number(parts[1]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (maxFds === undefined) return;\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + PROCESS_MAX_FDS,\n\t\thelp: 'Maximum number of open file descriptors.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tif (maxFds !== undefined) this.set(labels, maxFds);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [PROCESS_MAX_FDS];\n","'use strict';\n\nconst Gauge = require('../gauge');\n\n// Check if perf_hooks module is available\nlet perf_hooks;\ntry {\n\t/* eslint-disable node/no-unsupported-features/node-builtins */\n\tperf_hooks = require('perf_hooks');\n} catch {\n\t// node version is too old\n}\n\n// Reported always.\nconst NODEJS_EVENTLOOP_LAG = 'nodejs_eventloop_lag_seconds';\n\n// Reported only when perf_hooks is available.\nconst NODEJS_EVENTLOOP_LAG_MIN = 'nodejs_eventloop_lag_min_seconds';\nconst NODEJS_EVENTLOOP_LAG_MAX = 'nodejs_eventloop_lag_max_seconds';\nconst NODEJS_EVENTLOOP_LAG_MEAN = 'nodejs_eventloop_lag_mean_seconds';\nconst NODEJS_EVENTLOOP_LAG_STDDEV = 'nodejs_eventloop_lag_stddev_seconds';\nconst NODEJS_EVENTLOOP_LAG_P50 = 'nodejs_eventloop_lag_p50_seconds';\nconst NODEJS_EVENTLOOP_LAG_P90 = 'nodejs_eventloop_lag_p90_seconds';\nconst NODEJS_EVENTLOOP_LAG_P99 = 'nodejs_eventloop_lag_p99_seconds';\n\nfunction reportEventloopLag(start, gauge, labels) {\n\tconst delta = process.hrtime(start);\n\tconst nanosec = delta[0] * 1e9 + delta[1];\n\tconst seconds = nanosec / 1e9;\n\n\tgauge.set(labels, seconds);\n}\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\tconst registers = registry ? [registry] : undefined;\n\n\tlet collect = () => {\n\t\tconst start = process.hrtime();\n\t\tsetImmediate(reportEventloopLag, start, lag, labels);\n\t};\n\n\tif (perf_hooks && perf_hooks.monitorEventLoopDelay) {\n\t\ttry {\n\t\t\tconst histogram = perf_hooks.monitorEventLoopDelay({\n\t\t\t\tresolution: config.eventLoopMonitoringPrecision,\n\t\t\t});\n\t\t\thistogram.enable();\n\n\t\t\tcollect = () => {\n\t\t\t\tconst start = process.hrtime();\n\t\t\t\tsetImmediate(reportEventloopLag, start, lag, labels);\n\n\t\t\t\tlagMin.set(labels, histogram.min / 1e9);\n\t\t\t\tlagMax.set(labels, histogram.max / 1e9);\n\t\t\t\tlagMean.set(labels, histogram.mean / 1e9);\n\t\t\t\tlagStddev.set(labels, histogram.stddev / 1e9);\n\t\t\t\tlagP50.set(labels, histogram.percentile(50) / 1e9);\n\t\t\t\tlagP90.set(labels, histogram.percentile(90) / 1e9);\n\t\t\t\tlagP99.set(labels, histogram.percentile(99) / 1e9);\n\n\t\t\t\thistogram.reset();\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tif (e.code === 'ERR_NOT_IMPLEMENTED') {\n\t\t\t\treturn; // Bun\n\t\t\t}\n\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tconst lag = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG,\n\t\thelp: 'Lag of event loop in seconds.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect,\n\t});\n\tconst lagMin = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MIN,\n\t\thelp: 'The minimum recorded event loop delay.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'min',\n\t});\n\tconst lagMax = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MAX,\n\t\thelp: 'The maximum recorded event loop delay.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'max',\n\t});\n\tconst lagMean = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_MEAN,\n\t\thelp: 'The mean of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagStddev = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_STDDEV,\n\t\thelp: 'The standard deviation of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP50 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P50,\n\t\thelp: 'The 50th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP90 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P90,\n\t\thelp: 'The 90th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n\tconst lagP99 = new Gauge({\n\t\tname: namePrefix + NODEJS_EVENTLOOP_LAG_P99,\n\t\thelp: 'The 99th percentile of the recorded event loop delays.',\n\t\tregisters,\n\t\tlabelNames,\n\t\taggregator: 'average',\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_EVENTLOOP_LAG,\n\tNODEJS_EVENTLOOP_LAG_MIN,\n\tNODEJS_EVENTLOOP_LAG_MAX,\n\tNODEJS_EVENTLOOP_LAG_MEAN,\n\tNODEJS_EVENTLOOP_LAG_STDDEV,\n\tNODEJS_EVENTLOOP_LAG_P50,\n\tNODEJS_EVENTLOOP_LAG_P90,\n\tNODEJS_EVENTLOOP_LAG_P99,\n];\n","'use strict';\n\nfunction aggregateByObjectName(list) {\n\tconst data = {};\n\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst listElement = list[i];\n\n\t\tif (!listElement || typeof listElement.constructor === 'undefined') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (Object.hasOwnProperty.call(data, listElement.constructor.name)) {\n\t\t\tdata[listElement.constructor.name] += 1;\n\t\t} else {\n\t\t\tdata[listElement.constructor.name] = 1;\n\t\t}\n\t}\n\treturn data;\n}\n\nfunction updateMetrics(gauge, data, labels) {\n\tgauge.reset();\n\tfor (const key in data) {\n\t\tgauge.set(Object.assign({ type: key }, labels || {}), data[key]);\n\t}\n}\n\nmodule.exports = {\n\taggregateByObjectName,\n\tupdateMetrics,\n};\n","'use strict';\n\nconst { aggregateByObjectName } = require('./helpers/processMetricsHelpers');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\nconst Gauge = require('../gauge');\n\nconst NODEJS_ACTIVE_HANDLES = 'nodejs_active_handles';\nconst NODEJS_ACTIVE_HANDLES_TOTAL = 'nodejs_active_handles_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function is removed in later nodes (exists in node@6-12...)\n\tif (typeof process._getActiveHandles !== 'function') {\n\t\treturn;\n\t}\n\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_HANDLES,\n\t\thelp: 'Number of active libuv handles grouped by handle type. Every handle type is C++ class name.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters,\n\t\tcollect() {\n\t\t\tconst handles = process._getActiveHandles();\n\t\t\tupdateMetrics(this, aggregateByObjectName(handles), labels);\n\t\t},\n\t});\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_HANDLES_TOTAL,\n\t\thelp: 'Total number of active handles.',\n\t\tregisters,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst handles = process._getActiveHandles();\n\t\t\tthis.set(labels, handles.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_HANDLES,\n\tNODEJS_ACTIVE_HANDLES_TOTAL,\n];\n","'use strict';\nconst Gauge = require('../gauge');\nconst { aggregateByObjectName } = require('./helpers/processMetricsHelpers');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\n\nconst NODEJS_ACTIVE_REQUESTS = 'nodejs_active_requests';\nconst NODEJS_ACTIVE_REQUESTS_TOTAL = 'nodejs_active_requests_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function is removed in later nodes (exists in node@6)\n\tif (typeof process._getActiveRequests !== 'function') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_REQUESTS,\n\t\thelp: 'Number of active libuv requests grouped by request type. Every request type is C++ class name.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\tcollect() {\n\t\t\tconst requests = process._getActiveRequests();\n\t\t\tupdateMetrics(this, aggregateByObjectName(requests), labels);\n\t\t},\n\t});\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_REQUESTS_TOTAL,\n\t\thelp: 'Total number of active requests.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst requests = process._getActiveRequests();\n\t\t\tthis.set(labels, requests.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_REQUESTS,\n\tNODEJS_ACTIVE_REQUESTS_TOTAL,\n];\n","'use strict';\nconst Gauge = require('../gauge');\nconst { updateMetrics } = require('./helpers/processMetricsHelpers');\n\nconst NODEJS_ACTIVE_RESOURCES = 'nodejs_active_resources';\nconst NODEJS_ACTIVE_RESOURCES_TOTAL = 'nodejs_active_resources_total';\n\nmodule.exports = (registry, config = {}) => {\n\t// Don't do anything if the function does not exist in previous nodes (exists in node@17.3.0)\n\tif (typeof process.getActiveResourcesInfo !== 'function') {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_RESOURCES,\n\t\thelp: 'Number of active resources that are currently keeping the event loop alive, grouped by async resource type.',\n\t\tlabelNames: ['type', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\tcollect() {\n\t\t\tconst resources = process.getActiveResourcesInfo();\n\n\t\t\tconst data = {};\n\n\t\t\tfor (let i = 0; i < resources.length; i++) {\n\t\t\t\tconst resource = resources[i];\n\n\t\t\t\tif (Object.hasOwn(data, resource)) {\n\t\t\t\t\tdata[resource] += 1;\n\t\t\t\t} else {\n\t\t\t\t\tdata[resource] = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tupdateMetrics(this, data, labels);\n\t\t},\n\t});\n\n\tnew Gauge({\n\t\tname: namePrefix + NODEJS_ACTIVE_RESOURCES_TOTAL,\n\t\thelp: 'Total number of active resources.',\n\t\tregisters: registry ? [registry] : undefined,\n\t\tlabelNames,\n\t\tcollect() {\n\t\t\tconst resources = process.getActiveResourcesInfo();\n\t\t\tthis.set(labels, resources.length);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_ACTIVE_RESOURCES,\n\tNODEJS_ACTIVE_RESOURCES_TOTAL,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst safeMemoryUsage = require('./helpers/safeMemoryUsage');\n\nconst NODEJS_HEAP_SIZE_TOTAL = 'nodejs_heap_size_total_bytes';\nconst NODEJS_HEAP_SIZE_USED = 'nodejs_heap_size_used_bytes';\nconst NODEJS_EXTERNAL_MEMORY = 'nodejs_external_memory_bytes';\n\nmodule.exports = (registry, config = {}) => {\n\tif (typeof process.memoryUsage !== 'function') {\n\t\treturn;\n\t}\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst collect = () => {\n\t\tconst memUsage = safeMemoryUsage();\n\t\tif (memUsage) {\n\t\t\theapSizeTotal.set(labels, memUsage.heapTotal);\n\t\t\theapSizeUsed.set(labels, memUsage.heapUsed);\n\t\t\tif (memUsage.external !== undefined) {\n\t\t\t\texternalMemUsed.set(labels, memUsage.external);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst heapSizeTotal = new Gauge({\n\t\tname: namePrefix + NODEJS_HEAP_SIZE_TOTAL,\n\t\thelp: 'Process heap size from Node.js in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t\t// Use this one metric's `collect` to set all metrics' values.\n\t\tcollect,\n\t});\n\tconst heapSizeUsed = new Gauge({\n\t\tname: namePrefix + NODEJS_HEAP_SIZE_USED,\n\t\thelp: 'Process heap size used from Node.js in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n\tconst externalMemUsed = new Gauge({\n\t\tname: namePrefix + NODEJS_EXTERNAL_MEMORY,\n\t\thelp: 'Node.js external memory size in bytes.',\n\t\tregisters,\n\t\tlabelNames,\n\t});\n};\n\nmodule.exports.metricNames = [\n\tNODEJS_HEAP_SIZE_TOTAL,\n\tNODEJS_HEAP_SIZE_USED,\n\tNODEJS_EXTERNAL_MEMORY,\n];\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst v8 = require('v8');\n\nconst METRICS = ['total', 'used', 'available'];\nconst NODEJS_HEAP_SIZE = {};\n\nMETRICS.forEach(metricType => {\n\tNODEJS_HEAP_SIZE[metricType] = `nodejs_heap_space_size_${metricType}_bytes`;\n});\n\nmodule.exports = (registry, config = {}) => {\n\ttry {\n\t\tv8.getHeapSpaceStatistics();\n\t} catch (e) {\n\t\tif (e.code === 'ERR_NOT_IMPLEMENTED') {\n\t\t\treturn; // Bun\n\t\t}\n\t\tthrow e;\n\t}\n\tconst registers = registry ? [registry] : undefined;\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = ['space', ...Object.keys(labels)];\n\n\tconst gauges = {};\n\n\tMETRICS.forEach(metricType => {\n\t\tgauges[metricType] = new Gauge({\n\t\t\tname: namePrefix + NODEJS_HEAP_SIZE[metricType],\n\t\t\thelp: `Process heap space size ${metricType} from Node.js in bytes.`,\n\t\t\tlabelNames,\n\t\t\tregisters,\n\t\t});\n\t});\n\n\t// Use this one metric's `collect` to set all metrics' values.\n\tgauges.total.collect = () => {\n\t\tfor (const space of v8.getHeapSpaceStatistics()) {\n\t\t\tconst spaceName = space.space_name.substr(\n\t\t\t\t0,\n\t\t\t\tspace.space_name.indexOf('_space'),\n\t\t\t);\n\n\t\t\tgauges.total.set({ space: spaceName, ...labels }, space.space_size);\n\t\t\tgauges.used.set({ space: spaceName, ...labels }, space.space_used_size);\n\t\t\tgauges.available.set(\n\t\t\t\t{ space: spaceName, ...labels },\n\t\t\t\tspace.space_available_size,\n\t\t\t);\n\t\t}\n\t};\n};\n\nmodule.exports.metricNames = Object.values(NODEJS_HEAP_SIZE);\n","'use strict';\n\nconst Gauge = require('../gauge');\nconst version = process.version;\nconst versionSegments = version.slice(1).split('.').map(Number);\n\nconst NODE_VERSION_INFO = 'nodejs_version_info';\n\nmodule.exports = (registry, config = {}) => {\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\n\tnew Gauge({\n\t\tname: namePrefix + NODE_VERSION_INFO,\n\t\thelp: 'Node.js version info.',\n\t\tlabelNames: ['version', 'major', 'minor', 'patch', ...labelNames],\n\t\tregisters: registry ? [registry] : undefined,\n\t\taggregator: 'first',\n\t\tcollect() {\n\t\t\t// Needs to be in collect() so value is present even if reg is reset\n\t\t\tthis.labels(\n\t\t\t\tversion,\n\t\t\t\tversionSegments[0],\n\t\t\t\tversionSegments[1],\n\t\t\t\tversionSegments[2],\n\t\t\t\t...Object.values(labels),\n\t\t\t).set(1);\n\t\t},\n\t});\n};\n\nmodule.exports.metricNames = [NODE_VERSION_INFO];\n","'use strict';\nconst Histogram = require('../histogram');\n\nlet perf_hooks;\n\ntry {\n\t// eslint-disable-next-line\n\tperf_hooks = require('perf_hooks');\n} catch {\n\t// node version is too old\n}\n\nconst NODEJS_GC_DURATION_SECONDS = 'nodejs_gc_duration_seconds';\nconst DEFAULT_GC_DURATION_BUCKETS = [0.001, 0.01, 0.1, 1, 2, 5];\n\nconst kinds = [];\n\nif (perf_hooks && perf_hooks.constants) {\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR] = 'major';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR] = 'minor';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL] = 'incremental';\n\tkinds[perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB] = 'weakcb';\n}\n\nmodule.exports = (registry, config = {}) => {\n\tif (!perf_hooks) {\n\t\treturn;\n\t}\n\n\tconst namePrefix = config.prefix ? config.prefix : '';\n\tconst labels = config.labels ? config.labels : {};\n\tconst labelNames = Object.keys(labels);\n\tconst buckets = config.gcDurationBuckets\n\t\t? config.gcDurationBuckets\n\t\t: DEFAULT_GC_DURATION_BUCKETS;\n\tconst gcHistogram = new Histogram({\n\t\tname: namePrefix + NODEJS_GC_DURATION_SECONDS,\n\t\thelp: 'Garbage collection duration by kind, one of major, minor, incremental or weakcb.',\n\t\tlabelNames: ['kind', ...labelNames],\n\t\tenableExemplars: false,\n\t\tbuckets,\n\t\tregisters: registry ? [registry] : undefined,\n\t});\n\n\tconst obs = new perf_hooks.PerformanceObserver(list => {\n\t\tconst entry = list.getEntries()[0];\n\t\t// Node < 16 uses entry.kind\n\t\t// Node >= 16 uses entry.detail.kind\n\t\t// See: https://nodejs.org/docs/latest-v16.x/api/deprecations.html#deprecations_dep0152_extension_performanceentry_properties\n\t\tconst kind = entry.detail ? kinds[entry.detail.kind] : kinds[entry.kind];\n\t\t// Convert duration from milliseconds to seconds\n\t\tgcHistogram.observe(Object.assign({ kind }, labels), entry.duration / 1000);\n\t});\n\n\tobs.observe({ entryTypes: ['gc'] });\n};\n\nmodule.exports.metricNames = [NODEJS_GC_DURATION_SECONDS];\n","'use strict';\n\nconst { isObject } = require('./util');\n\n// Default metrics.\nconst processCpuTotal = require('./metrics/processCpuTotal');\nconst processStartTime = require('./metrics/processStartTime');\nconst osMemoryHeap = require('./metrics/osMemoryHeap');\nconst processOpenFileDescriptors = require('./metrics/processOpenFileDescriptors');\nconst processMaxFileDescriptors = require('./metrics/processMaxFileDescriptors');\nconst eventLoopLag = require('./metrics/eventLoopLag');\nconst processHandles = require('./metrics/processHandles');\nconst processRequests = require('./metrics/processRequests');\nconst processResources = require('./metrics/processResources');\nconst heapSizeAndUsed = require('./metrics/heapSizeAndUsed');\nconst heapSpacesSizeAndUsed = require('./metrics/heapSpacesSizeAndUsed');\nconst version = require('./metrics/version');\nconst gc = require('./metrics/gc');\n\nconst metrics = {\n\tprocessCpuTotal,\n\tprocessStartTime,\n\tosMemoryHeap,\n\tprocessOpenFileDescriptors,\n\tprocessMaxFileDescriptors,\n\teventLoopLag,\n\t...(typeof process.getActiveResourcesInfo === 'function'\n\t\t? { processResources }\n\t\t: {}),\n\tprocessHandles,\n\tprocessRequests,\n\theapSizeAndUsed,\n\theapSpacesSizeAndUsed,\n\tversion,\n\tgc,\n};\nconst metricsList = Object.keys(metrics);\n\nmodule.exports = function collectDefaultMetrics(config) {\n\tif (config !== null && config !== undefined && !isObject(config)) {\n\t\tthrow new TypeError('config must be null, undefined, or an object');\n\t}\n\n\tconfig = { eventLoopMonitoringPrecision: 10, ...config };\n\n\tfor (const metric of Object.values(metrics)) {\n\t\tmetric(config.register, config);\n\t}\n};\n\nmodule.exports.metricsList = metricsList;\n","'use strict';\n\nconst { Grouper, hashObject } = require('./util');\n\n/**\n * Returns a new function that applies the `aggregatorFn` to the values.\n * @param {Function} aggregatorFn function to apply to values.\n * @return {Function} aggregator function\n */\nfunction AggregatorFactory(aggregatorFn) {\n\treturn metrics => {\n\t\tif (metrics.length === 0) return;\n\t\tconst result = {\n\t\t\thelp: metrics[0].help,\n\t\t\tname: metrics[0].name,\n\t\t\ttype: metrics[0].type,\n\t\t\tvalues: [],\n\t\t\taggregator: metrics[0].aggregator,\n\t\t};\n\t\t// Gather metrics by metricName and labels.\n\t\tconst byLabels = new Grouper();\n\t\tmetrics.forEach(metric => {\n\t\t\tmetric.values.forEach(value => {\n\t\t\t\tconst key = hashObject(value.labels);\n\t\t\t\tbyLabels.add(`${value.metricName}_${key}`, value);\n\t\t\t});\n\t\t});\n\t\t// Apply aggregator function to gathered metrics.\n\t\tbyLabels.forEach(values => {\n\t\t\tif (values.length === 0) return;\n\t\t\tconst valObj = {\n\t\t\t\tvalue: aggregatorFn(values),\n\t\t\t\tlabels: values[0].labels,\n\t\t\t};\n\t\t\tif (values[0].metricName) {\n\t\t\t\tvalObj.metricName = values[0].metricName;\n\t\t\t}\n\t\t\t// NB: Timestamps are omitted.\n\t\t\tresult.values.push(valObj);\n\t\t});\n\t\treturn result;\n\t};\n}\n// Export for users to define their own aggregation methods.\nexports.AggregatorFactory = AggregatorFactory;\n\n/**\n * Functions that can be used to aggregate metrics from multiple registries.\n */\nexports.aggregators = {\n\t/**\n\t * @return The sum of values.\n\t */\n\tsum: AggregatorFactory(v => v.reduce((p, c) => p + c.value, 0)),\n\t/**\n\t * @return The first value.\n\t */\n\tfirst: AggregatorFactory(v => v[0].value),\n\t/**\n\t * @return {undefined} Undefined; omits the metric.\n\t */\n\tomit: () => {},\n\t/**\n\t * @return The arithmetic mean of the values.\n\t */\n\taverage: AggregatorFactory(\n\t\tv => v.reduce((p, c) => p + c.value, 0) / v.length,\n\t),\n\t/**\n\t * @return The minimum of the values.\n\t */\n\tmin: AggregatorFactory(v =>\n\t\tv.reduce((p, c) => Math.min(p, c.value), Infinity),\n\t),\n\t/**\n\t * @return The maximum of the values.\n\t */\n\tmax: AggregatorFactory(v =>\n\t\tv.reduce((p, c) => Math.max(p, c.value), -Infinity),\n\t),\n};\n","'use strict';\n\n/**\n * Extends the Registry class with a `clusterMetrics` method that returns\n * aggregated metrics for all workers.\n *\n * In cluster workers, listens for and responds to requests for metrics by the\n * cluster master.\n */\n\nconst Registry = require('./registry');\nconst { Grouper } = require('./util');\nconst { aggregators } = require('./metricAggregators');\n// We need to lazy-load the 'cluster' module as some application servers -\n// namely Passenger - crash when it is imported.\nlet cluster = () => {\n\tconst data = require('cluster');\n\tcluster = () => data;\n\treturn data;\n};\n\nconst GET_METRICS_REQ = 'prom-client:getMetricsReq';\nconst GET_METRICS_RES = 'prom-client:getMetricsRes';\n\nlet registries = [Registry.globalRegistry];\nlet requestCtr = 0; // Concurrency control\nlet listenersAdded = false;\nconst requests = new Map(); // Pending requests for workers' local metrics.\n\nclass AggregatorRegistry extends Registry {\n\tconstructor(regContentType = Registry.PROMETHEUS_CONTENT_TYPE) {\n\t\tsuper(regContentType);\n\t\taddListeners();\n\t}\n\n\t/**\n\t * Gets aggregated metrics for all workers. The optional callback and\n\t * returned Promise resolve with the same value; either may be used.\n\t * @return {Promise<string>} Promise that resolves with the aggregated\n\t * metrics.\n\t */\n\tclusterMetrics() {\n\t\tconst requestId = requestCtr++;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet settled = false;\n\t\t\tfunction done(err, result) {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t}\n\n\t\t\tconst request = {\n\t\t\t\tresponses: [],\n\t\t\t\tpending: 0,\n\t\t\t\tdone,\n\t\t\t\terrorTimeout: setTimeout(() => {\n\t\t\t\t\tconst err = new Error('Operation timed out.');\n\t\t\t\t\trequest.done(err);\n\t\t\t\t}, 5000),\n\t\t\t};\n\t\t\trequests.set(requestId, request);\n\n\t\t\tconst message = {\n\t\t\t\ttype: GET_METRICS_REQ,\n\t\t\t\trequestId,\n\t\t\t};\n\n\t\t\tfor (const id in cluster().workers) {\n\t\t\t\t// If the worker exits abruptly, it may still be in the workers\n\t\t\t\t// list but not able to communicate.\n\t\t\t\tif (cluster().workers[id].isConnected()) {\n\t\t\t\t\tcluster().workers[id].send(message);\n\t\t\t\t\trequest.pending++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (request.pending === 0) {\n\t\t\t\t// No workers were up\n\t\t\t\tclearTimeout(request.errorTimeout);\n\t\t\t\tprocess.nextTick(() => done(null, ''));\n\t\t\t}\n\t\t});\n\t}\n\n\tget contentType() {\n\t\treturn super.contentType;\n\t}\n\n\t/**\n\t * Creates a new Registry instance from an array of metrics that were\n\t * created by `registry.getMetricsAsJSON()`. Metrics are aggregated using\n\t * the method specified by their `aggregator` property, or by summation if\n\t * `aggregator` is undefined.\n\t * @param {Array} metricsArr Array of metrics, each of which created by\n\t * `registry.getMetricsAsJSON()`.\n\t * @param {string} registryType content type of the new registry. Defaults\n\t * to PROMETHEUS_CONTENT_TYPE.\n\t * @return {Registry} aggregated registry.\n\t */\n\tstatic aggregate(\n\t\tmetricsArr,\n\t\tregistryType = Registry.PROMETHEUS_CONTENT_TYPE,\n\t) {\n\t\tconst aggregatedRegistry = new Registry();\n\t\tconst metricsByName = new Grouper();\n\n\t\taggregatedRegistry.setContentType(registryType);\n\n\t\t// Gather by name\n\t\tmetricsArr.forEach(metrics => {\n\t\t\tmetrics.forEach(metric => {\n\t\t\t\tmetricsByName.add(metric.name, metric);\n\t\t\t});\n\t\t});\n\n\t\t// Aggregate gathered metrics.\n\t\tmetricsByName.forEach(metrics => {\n\t\t\tconst aggregatorName = metrics[0].aggregator;\n\t\t\tconst aggregatorFn = aggregators[aggregatorName];\n\t\t\tif (typeof aggregatorFn !== 'function') {\n\t\t\t\tthrow new Error(`'${aggregatorName}' is not a defined aggregator.`);\n\t\t\t}\n\t\t\tconst aggregatedMetric = aggregatorFn(metrics);\n\t\t\t// NB: The 'omit' aggregator returns undefined.\n\t\t\tif (aggregatedMetric) {\n\t\t\t\tconst aggregatedMetricWrapper = Object.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tget: () => aggregatedMetric,\n\t\t\t\t\t},\n\t\t\t\t\taggregatedMetric,\n\t\t\t\t);\n\t\t\t\taggregatedRegistry.registerMetric(aggregatedMetricWrapper);\n\t\t\t}\n\t\t});\n\n\t\treturn aggregatedRegistry;\n\t}\n\n\t/**\n\t * Sets the registry or registries to be aggregated. Call from workers to\n\t * use a registry/registries other than the default global registry.\n\t * @param {Array<Registry>|Registry} regs Registry or registries to be\n\t * aggregated.\n\t * @return {void}\n\t */\n\tstatic setRegistries(regs) {\n\t\tif (!Array.isArray(regs)) regs = [regs];\n\t\tregs.forEach(reg => {\n\t\t\tif (!(reg instanceof Registry)) {\n\t\t\t\tthrow new TypeError(`Expected Registry, got ${typeof reg}`);\n\t\t\t}\n\t\t});\n\t\tregistries = regs;\n\t}\n}\n\n/**\n * Adds event listeners for cluster aggregation. Idempotent (safe to call more\n * than once).\n * @return {void}\n */\nfunction addListeners() {\n\tif (listenersAdded) return;\n\tlistenersAdded = true;\n\n\tif (cluster().isMaster) {\n\t\t// Listen for worker responses to requests for local metrics\n\t\tcluster().on('message', (worker, message) => {\n\t\t\tif (message.type === GET_METRICS_RES) {\n\t\t\t\tconst request = requests.get(message.requestId);\n\n\t\t\t\tif (message.error) {\n\t\t\t\t\trequest.done(new Error(message.error));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tmessage.metrics.forEach(registry => request.responses.push(registry));\n\t\t\t\trequest.pending--;\n\n\t\t\t\tif (request.pending === 0) {\n\t\t\t\t\t// finalize\n\t\t\t\t\trequests.delete(message.requestId);\n\t\t\t\t\tclearTimeout(request.errorTimeout);\n\n\t\t\t\t\tconst registry = AggregatorRegistry.aggregate(request.responses);\n\t\t\t\t\tconst promString = registry.metrics();\n\t\t\t\t\trequest.done(null, promString);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (cluster().isWorker) {\n\t\t// Respond to master's requests for worker's local metrics.\n\t\tprocess.on('message', message => {\n\t\t\tif (message.type === GET_METRICS_REQ) {\n\t\t\t\tPromise.all(registries.map(r => r.getMetricsAsJSON()))\n\t\t\t\t\t.then(metrics => {\n\t\t\t\t\t\tprocess.send({\n\t\t\t\t\t\t\ttype: GET_METRICS_RES,\n\t\t\t\t\t\t\trequestId: message.requestId,\n\t\t\t\t\t\t\tmetrics,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\tprocess.send({\n\t\t\t\t\t\t\ttype: GET_METRICS_RES,\n\t\t\t\t\t\t\trequestId: message.requestId,\n\t\t\t\t\t\t\terror: error.message,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n}\n\nmodule.exports = AggregatorRegistry;\n","/**\n * Prometheus client\n * @module Prometheus client\n */\n\n'use strict';\n\nexports.register = require('./lib/registry').globalRegistry;\nexports.Registry = require('./lib/registry');\nObject.defineProperty(exports, 'contentType', {\n\tconfigurable: false,\n\tenumerable: true,\n\tget() {\n\t\treturn exports.register.contentType;\n\t},\n\tset(value) {\n\t\texports.register.setContentType(value);\n\t},\n});\nexports.prometheusContentType = exports.Registry.PROMETHEUS_CONTENT_TYPE;\nexports.openMetricsContentType = exports.Registry.OPENMETRICS_CONTENT_TYPE;\nexports.validateMetricName = require('./lib/validation').validateMetricName;\n\nexports.Counter = require('./lib/counter');\nexports.Gauge = require('./lib/gauge');\nexports.Histogram = require('./lib/histogram');\nexports.Summary = require('./lib/summary');\nexports.Pushgateway = require('./lib/pushgateway');\n\nexports.linearBuckets = require('./lib/bucketGenerators').linearBuckets;\nexports.exponentialBuckets =\n\trequire('./lib/bucketGenerators').exponentialBuckets;\n\nexports.collectDefaultMetrics = require('./lib/defaultMetrics');\n\nexports.aggregators = require('./lib/metricAggregators').aggregators;\nexports.AggregatorRegistry = require('./lib/cluster');\n","import {Registry} from 'prom-client';\n\nexport const registry = new Registry();\n","import {MethodDescriptor} from 'nice-grpc-common';\nimport {Counter, exponentialBuckets} from 'prom-client';\n\nexport const typeLabel = 'grpc_type';\nexport const serviceLabel = 'grpc_service';\nexport const methodLabel = 'grpc_method';\nexport const pathLabel = 'grpc_path';\nexport const codeLabel = 'grpc_code';\n\n/**\n * 1ms, 4ms, 16ms, ..., ~1 hour in seconds\n */\nexport const latencySecondsBuckets = exponentialBuckets(0.001, 4, 12);\nexport const labelNames = [typeLabel, serviceLabel, methodLabel, pathLabel];\nexport const labelNamesWithCode = [...labelNames, codeLabel];\n\nexport function getLabels(method: MethodDescriptor) {\n const callType = method.requestStream\n ? method.responseStream\n ? 'bidi_stream'\n : 'client_stream'\n : method.responseStream\n ? 'server_stream'\n : 'unary';\n\n const {path} = method;\n\n const [serviceName, methodName] = path.split('/').slice(1);\n\n return {\n [typeLabel]: callType,\n [serviceLabel]: serviceName,\n [methodLabel]: methodName,\n [pathLabel]: path,\n };\n}\n\nexport async function* incrementStreamMessagesCounter<T>(\n iterable: AsyncIterable<T>,\n counter: Counter.Internal,\n): AsyncIterable<T> {\n for await (const item of iterable) {\n counter.inc();\n\n yield item;\n }\n}\n","import {isAbortError} from 'abort-controller-x';\nimport {\n CallContext,\n ServerError,\n ServerMiddleware,\n ServerMiddlewareCall,\n Status,\n} from 'nice-grpc-common';\nimport {Counter, Histogram} from 'prom-client';\nimport {\n codeLabel,\n getLabels,\n incrementStreamMessagesCounter,\n labelNames,\n labelNamesWithCode,\n latencySecondsBuckets,\n methodLabel,\n pathLabel,\n serviceLabel,\n typeLabel,\n} from './common';\nimport {registry} from './registry';\n\nconst defaultStartedMetric = new Counter({\n registers: [registry],\n name: 'grpc_server_started_total',\n help: 'Total number of RPCs started on the server.',\n labelNames,\n});\n\nconst defaultHandledMetric = new Counter({\n registers: [registry],\n name: 'grpc_server_handled_total',\n help: 'Total number of RPCs completed on the server, regardless of success or failure.',\n labelNames: labelNamesWithCode,\n});\n\nconst defaultStreamMsgReceivedMetric = new Counter({\n registers: [registry],\n name: 'grpc_server_msg_received_total',\n help: 'Total number of RPC stream messages received by the server.',\n labelNames,\n});\n\nconst defaultStreamMsgSentMetric = new Counter({\n registers: [registry],\n name: 'grpc_server_msg_sent_total',\n help: 'Total number of gRPC stream messages sent by the server.',\n labelNames,\n});\n\nconst defaultHandlingSecondsMetric = new Histogram({\n registers: [registry],\n name: 'grpc_server_handling_seconds',\n help: 'Histogram of response latency (seconds) of gRPC that had been application-level handled by the server.',\n labelNames: labelNamesWithCode,\n buckets: latencySecondsBuckets,\n});\n\ntype PrometheusServerMiddlewareOptions = {\n serverStartedMetric?: Counter<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n >;\n serverHandledMetric?: Counter<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n | typeof codeLabel\n >;\n serverStreamMsgReceivedMetric?: Counter<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n >;\n serverStreamMsgSentMetric?: Counter<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n >;\n serverHandlingSecondsMetric?: Histogram<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n | typeof codeLabel\n >;\n};\n\nexport function prometheusServerMiddleware(\n options?: PrometheusServerMiddlewareOptions,\n): ServerMiddleware {\n const serverStartedMetric =\n options?.serverStartedMetric || defaultStartedMetric;\n const serverHandledMetric =\n options?.serverHandledMetric || defaultHandledMetric;\n const serverStreamMsgReceivedMetric =\n options?.serverStreamMsgReceivedMetric || defaultStreamMsgReceivedMetric;\n const serverStreamMsgSentMetric =\n options?.serverStreamMsgSentMetric || defaultStreamMsgSentMetric;\n const serverHandlingSecondsMetric =\n options?.serverHandlingSecondsMetric || defaultHandlingSecondsMetric;\n\n return async function* prometheusServerMiddlewareGenerator<Request, Response>(\n call: ServerMiddlewareCall<Request, Response>,\n context: CallContext,\n ): AsyncGenerator<Response, Response | void, undefined> {\n const labels = getLabels(call.method);\n\n serverStartedMetric.inc(labels);\n\n const stopTimer = serverHandlingSecondsMetric.startTimer(labels);\n\n let settled = false;\n let status: Status = Status.OK;\n\n try {\n let request;\n\n if (!call.requestStream) {\n request = call.request;\n } else {\n request = incrementStreamMessagesCounter(\n call.request,\n serverStreamMsgReceivedMetric.labels(labels),\n );\n }\n\n if (!call.responseStream) {\n const response = yield* call.next(request, context);\n\n settled = true;\n\n return response;\n } else {\n yield* incrementStreamMessagesCounter(\n call.next(request, context),\n serverStreamMsgSentMetric.labels(labels),\n );\n\n settled = true;\n\n return;\n }\n } catch (err: unknown) {\n settled = true;\n\n if (err instanceof ServerError) {\n status = err.code;\n } else if (isAbortError(err)) {\n status = Status.CANCELLED;\n } else {\n status = Status.UNKNOWN;\n }\n\n throw err;\n } finally {\n if (!settled) {\n status = Status.CANCELLED;\n }\n\n stopTimer({[codeLabel]: Status[status]});\n serverHandledMetric.inc({\n ...labels,\n [codeLabel]: Status[status],\n });\n }\n };\n}\n","import {isAbortError} from 'abort-controller-x';\nimport {\n CallOptions,\n ClientError,\n ClientMiddleware,\n ClientMiddlewareCall,\n Status,\n} from 'nice-grpc-common';\nimport {Counter, Histogram} from 'prom-client';\nimport {\n codeLabel,\n getLabels,\n incrementStreamMessagesCounter,\n labelNames,\n labelNamesWithCode,\n latencySecondsBuckets,\n methodLabel,\n pathLabel,\n serviceLabel,\n typeLabel,\n} from './common';\nimport {registry} from './registry';\n\nconst defaultClientStartedMetric = new Counter({\n registers: [registry],\n name: 'grpc_client_started_total',\n help: 'Total number of RPCs started on the client.',\n labelNames,\n});\n\nconst defaultClientHandledMetric = new Counter({\n registers: [registry],\n name: 'grpc_client_handled_total',\n help: 'Total number of RPCs completed on the client, regardless of success or failure.',\n labelNames: labelNamesWithCode,\n});\n\nconst defaultClientStreamMsgReceivedMetric = new Counter({\n registers: [registry],\n name: 'grpc_client_msg_received_total',\n help: 'Total number of RPC stream messages received by the client.',\n labelNames,\n});\n\nconst defaultClientStreamMsgSentMetric = new Counter({\n registers: [registry],\n name: 'grpc_client_msg_sent_total',\n help: 'Total number of gRPC stream messages sent by the client.',\n labelNames,\n});\n\nconst defaultClientHandlingSecondsMetric = new Histogram({\n registers: [registry],\n name: 'grpc_client_handling_seconds',\n help: 'Histogram of response latency (seconds) of the gRPC until it is finished by the application.',\n labelNames: labelNamesWithCode,\n buckets: latencySecondsBuckets,\n});\n\ntype PrometheusClientMiddlewareOptions = {\n clientStartedMetric?: Counter<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n >;\n clientHandledMetric?: Counter<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n | typeof codeLabel\n >;\n clientStreamMsgReceivedMetric?: Counter<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n >;\n clientStreamMsgSentMetric?: Counter<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n >;\n clientHandlingSecondsMetric?: Histogram<\n | typeof typeLabel\n | typeof serviceLabel\n | typeof methodLabel\n | typeof pathLabel\n | typeof codeLabel\n >;\n};\n\nexport function prometheusClientMiddleware(\n options?: PrometheusClientMiddlewareOptions,\n): ClientMiddleware {\n const clientStartedMetric =\n options?.clientStartedMetric || defaultClientStartedMetric;\n const clientHandledMetric =\n options?.clientHandledMetric || defaultClientHandledMetric;\n const clientStreamMsgReceivedMetric =\n options?.clientStreamMsgReceivedMetric ||\n defaultClientStreamMsgReceivedMetric;\n const clientStreamMsgSentMetric =\n options?.clientStreamMsgSentMetric || defaultClientStreamMsgSentMetric;\n const clientHandlingSecondsMetric =\n options?.clientHandlingSecondsMetric || defaultClientHandlingSecondsMetric;\n\n return async function* prometheusClientMiddlewareGenerator<Request, Response>(\n call: ClientMiddlewareCall<Request, Response>,\n options: CallOptions,\n ): AsyncGenerator<Response, Response | void, undefined> {\n const labels = getLabels(call.method);\n\n clientStartedMetric.inc(labels);\n\n const stopTimer = clientHandlingSecondsMetric.startTimer(labels);\n\n let settled = false;\n let status: Status = Status.OK;\n\n try {\n let request;\n\n if (!call.requestStream) {\n request = call.request;\n } else {\n request = incrementStreamMessagesCounter(\n call.request,\n clientStreamMsgSentMetric.labels(labels),\n );\n }\n\n if (!call.responseStream) {\n const response = yield* call.next(request, options);\n\n settled = true;\n\n return response;\n } else {\n yield* incrementStreamMessagesCounter(\n call.next(request, options),\n clientStreamMsgReceivedMetric.labels(labels),\n );\n\n settled = true;\n\n return;\n }\n } catch (err: unknown) {\n settled = true;\n\n if (err instanceof ClientError) {\n status = err.code;\n } else if (isAbortError(err)) {\n status = Status.CANCELLED;\n } else {\n status = Status.UNKNOWN;\n }\n\n throw err;\n } finally {\n if (!settled) {\n status = Status.CANCELLED;\n }\n\n stopTimer({[codeLabel]: Status[status]});\n clientHandledMetric.inc({\n ...labels,\n [codeLabel]: Status[status],\n });\n }\n };\n}\n","export {registry} from './registry';\n\nexport {prometheusServerMiddleware} from './server';\nexport {prometheusClientMiddleware} from './client';\n\nexport {labelNames, labelNamesWithCode} from './common';\n","import {delay, rethrowAbortError} from 'abort-controller-x';\nimport {ClientError, ClientMiddleware, Status} from 'nice-grpc-common';\n\n/**\n * These options are added to `CallOptions` by\n * `nice-grpc-client-middleware-retry`.\n */\nexport type RetryOptions = {\n /**\n * Boolean indicating whether retries are enabled.\n *\n * If the method is marked as idempotent in Protobuf, i.e. has\n *\n * option idempotency_level = IDEMPOTENT;\n *\n * then the default is `true`. Otherwise the default is `false`.\n *\n * Method options currently work only when compiling with `ts-proto`.\n */\n retry?: boolean;\n /**\n * Base delay between retry attempts in milliseconds.\n *\n * Defaults to 1000.\n *\n * Example: if `retryBaseDelayMs` is 100, then retries will be attempted in\n * 100ms, 200ms, 400ms etc (not counting jitter).\n */\n retryBaseDelayMs?: number;\n /**\n * Maximum delay between attempts in milliseconds.\n *\n * Defaults to 30 seconds.\n *\n * Example: if `retryBaseDelayMs` is 1000 and `retryMaxDelayMs` is 3000, then\n * retries will be attempted in 1000ms, 2000ms, 3000ms, 3000ms etc (not\n * counting jitter).\n */\n retryMaxDelayMs?: number;\n /**\n * Maximum for the total number of attempts. `Infinity` is supported.\n *\n * Defaults to 1, i.e. a single retry will be attempted.\n */\n retryMaxAttempts?: number;\n /**\n * Array of retryable status codes.\n *\n * Default is `[UNKNOWN, INTERNAL, UNAVAILABLE, CANCELLED]`.\n */\n retryableStatuses?: Status[];\n /**\n * Called after receiving error with retryable status code before setting\n * backoff delay timer.\n *\n * If the error code is not retryable, or the maximum attempts exceeded, this\n * function will not be called and the error will be thrown from the client\n * method.\n */\n onRetryableError?(error: ClientError, attempt: number, delayMs: number): void;\n};\n\nconst defaultRetryableStatuses: Status[] = [\n Status.UNKNOWN,\n Status.INTERNAL,\n Status.UNAVAILABLE,\n // Server may return `CANCELLED` if it is shutting down. We can distinguish\n // this from client-initiated cancellations because these are returned as\n // `AbortError`s.\n Status.CANCELLED,\n];\n\n/**\n * Client middleware that adds automatic retries to unary calls.\n */\nexport const retryMiddleware: ClientMiddleware<RetryOptions> =\n async function* retryMiddleware(call, options) {\n const {idempotencyLevel} = call.method.options;\n const isIdempotent =\n idempotencyLevel === 'IDEMPOTENT' ||\n idempotencyLevel === 'NO_SIDE_EFFECTS';\n\n const {\n retry = isIdempotent,\n retryBaseDelayMs = 1000,\n retryMaxDelayMs = 30000,\n retryMaxAttempts = 1,\n onRetryableError,\n retryableStatuses = defaultRetryableStatuses,\n ...restOptions\n } = options;\n\n if (call.requestStream || call.responseStream || !retry) {\n return yield* call.next(call.request, restOptions);\n }\n\n const signal = options.signal ?? new AbortController().signal;\n\n for (let attempt = 0; ; attempt++) {\n try {\n return yield* call.next(call.request, restOptions);\n } catch (error: unknown) {\n rethrowAbortError(error);\n\n if (\n attempt >= retryMaxAttempts ||\n !(error instanceof ClientError) ||\n !retryableStatuses.includes(error.code)\n ) {\n throw error;\n }\n\n // https://aws.amazon.com/ru/blogs/architecture/exponential-backoff-and-jitter/\n const backoff = Math.min(\n retryMaxDelayMs,\n Math.pow(2, attempt) * retryBaseDelayMs,\n );\n const delayMs = Math.round((backoff * (1 + Math.random())) / 2);\n\n onRetryableError?.(error, attempt, delayMs);\n\n await delay(signal, delayMs);\n }\n }\n };\n","import { Block, Provider } from 'ethers'\n\nasync function getBlockSafely(provider: Provider, blockNumber: number | string): Promise<Block> {\n const block = await provider.getBlock(blockNumber)\n if (!block) {\n throw new Error(`Block ${blockNumber} not found.`)\n }\n return block\n}\n\nexport async function estimateBlockNumberAtDate(\n provider: Provider,\n targetDate: Date,\n startBlock?: number\n): Promise<number> {\n // Convert the Date object to a Unix timestamp (in seconds)\n const targetTimestamp = Math.floor(targetDate.getTime() / 1000)\n\n // Step 1: Get the current block number and its timestamp\n const latestBlock = await getBlockSafely(provider, 'latest')\n const earliestBlockNumber = startBlock !== undefined ? startBlock : 0\n const earliestBlock = await getBlockSafely(provider, earliestBlockNumber)\n\n // Binary search initialization\n let low = earliestBlock.number\n let high = latestBlock.number\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const midBlock = await getBlockSafely(provider, mid)\n\n if (midBlock.timestamp === targetTimestamp) {\n return midBlock.number // Exact match\n } else if (midBlock.timestamp < targetTimestamp) {\n low = mid + 1 // Target is in the upper half\n } else {\n high = mid - 1 // Target is in the lower half\n }\n }\n\n // If exact timestamp is not found, return the closest block number\n const closestBlock = await getBlockSafely(provider, high)\n return closestBlock.number\n}\n;process.stdout.write(\"\");","// import { BigDecimal } from '../core/big-decimal.js'\n// import { Numberish } from '../core/index.js'\n// import { MetricValue } from '@sentio/protos'\n\nexport function bytesToBigInt(bytes: Uint8Array) {\n let intValue = BigInt(0)\n for (let i = 0; i < bytes.length; i++) {\n intValue = intValue * BigInt(256) + BigInt(bytes[i])\n }\n return intValue\n}\n\n// export function metricValueToNumberish(v: MetricValue): Numberish {\n// if (v.doubleValue) {\n// return v.doubleValue\n// }\n// if (v.bigInteger) {\n// let intValue = bytesToBigInt(v.bigInteger.data)\n// if (v.bigInteger.negative) {\n// intValue = -intValue\n// }\n// return intValue\n// }\n//\n// if (v.bigDecimal) {\n// return new BigDecimal(v.bigDecimal)\n// }\n//\n// throw Error(\"MetricValue doesn't contain any of possible value\")\n// }\n;process.stdout.write(\"\");","import { getERC20Contract } from '../eth/builtin/erc20.js'\nimport { getERC20BytesContract } from '../eth/builtin/erc20bytes.js'\nimport { BigDecimal, scaleDown } from '../core/big-decimal.js'\nimport { PromiseOrValue } from '../eth/builtin/internal/common.js'\nimport { decodeBytes32String } from 'ethers'\nimport { EthChainId, EthContext } from '../eth/index.js'\nimport { BaseContext } from '../core/index.js'\nimport { LRUCache } from 'lru-cache'\n\nexport interface TokenInfo {\n symbol: string\n name: string\n decimal: number\n}\n\nexport const NATIVE_ETH = {\n symbol: 'ETH',\n decimal: 18,\n name: 'Native ETH'\n}\n\nconst TOKEN_INFOS = new LRUCache<string, Promise<TokenInfo>>({\n max: 10000,\n ttl: 1000 * 60 * 60 // 1 hour\n})\n\nasync function getTokenInfoPromise(\n symbol: PromiseOrValue<string> | string,\n name: PromiseOrValue<string> | string,\n decimal: PromiseOrValue<bigint>\n): Promise<TokenInfo> {\n return {\n symbol: await symbol,\n name: await name,\n decimal: Number(await decimal)\n }\n}\n\nexport async function getERC20TokenInfo(\n contextOrNetworkish: EthContext | EthChainId,\n tokenAddress: string\n): Promise<TokenInfo> {\n let chainId: EthChainId\n if (contextOrNetworkish instanceof BaseContext) {\n chainId = contextOrNetworkish.getChainId()\n } else {\n chainId = contextOrNetworkish || EthChainId.ETHEREUM\n }\n\n const key = chainId + tokenAddress\n const res = TOKEN_INFOS.get(key)\n if (res) {\n return res\n }\n const contract = getERC20Contract(chainId, tokenAddress)\n const bytesContract = getERC20BytesContract(chainId, tokenAddress)\n\n let name = ''\n try {\n name = await contract.name()\n } catch (e) {\n name = decodeBytes32String(await bytesContract.name())\n }\n\n let symbol = ''\n try {\n symbol = await contract.symbol()\n } catch (e) {\n symbol = decodeBytes32String(await bytesContract.symbol())\n }\n\n const decimal = await contract.decimals()\n const info = getTokenInfoPromise(symbol, name, decimal)\n\n TOKEN_INFOS.set(key, info)\n return info\n}\n\nexport async function getER20NormalizedAmount(\n contextOrNetworkish: EthContext | EthChainId,\n tokenAddress: string,\n amount: bigint\n): Promise<BigDecimal> {\n const tokenInfo = await getERC20TokenInfo(contextOrNetworkish, tokenAddress)\n return scaleDown(amount, tokenInfo.decimal)\n}\n;process.stdout.write(\"\");","/**\n * @module LRUCache\n */\n\n// module-private names and types\ntype Perf = { now: () => number }\nconst perf: Perf =\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date\n\nconst warned = new Set<string>()\n\n// either a function or a class\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ? process : {}\n) as { [k: string]: any }\n/* c8 ignore start */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC\n) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`)\n}\n\nlet AC = globalThis.AbortController\nlet AS = globalThis.AbortSignal\n\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort?: (...a: any[]) => any\n _onabort: ((...a: any[]) => any)[] = []\n reason?: any\n aborted: boolean = false\n addEventListener(_: string, fn: (...a: any[]) => any) {\n this._onabort.push(fn)\n }\n }\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill()\n }\n signal = new AS()\n abort(reason: any) {\n if (this.signal.aborted) return\n //@ts-ignore\n this.signal.reason = reason\n //@ts-ignore\n this.signal.aborted = true\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason)\n }\n this.signal.onabort?.(reason)\n }\n }\n let printACPolyfillWarning =\n PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning) return\n printACPolyfillWarning = false\n emitWarning(\n 'AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.',\n 'NO_ABORT_CONTROLLER',\n 'ENOTSUP',\n warnACPolyfill\n )\n }\n}\n/* c8 ignore stop */\n\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: any): n is PosInt =>\n n && n === Math.floor(n) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max: number) =>\n !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array<number> {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n heap: NumberArray\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(\n max: number,\n HeapCls: { new (n: number): NumberArray }\n ) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch<V> = Promise<V | undefined> & {\n __returned: BackgroundFetch<V> | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask<K, V> = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer<K, V> = (\n value: V,\n key: K,\n reason: DisposeReason\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator<K, V> = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions<K, V, FC = unknown> {\n signal: AbortSignal\n options: FetcherFetchOptions<K, V, FC>\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n */\n export interface Status<V> {\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss'\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The old value, specified in the case of `set:'update'` or\n * `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions<K, V, FC = unknown>\n extends Pick<\n OptionsBase<K, V, FC>,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status<V>\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions<K, V, FC>\n extends FetcherFetchOptions<K, V, FC> {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status<V>\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext<K, V, FC>\n extends FetchOptions<K, V, FC> {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<K, V>\n extends FetchOptions<K, V, undefined> {\n context?: undefined\n }\n\n export interface MemoOptions<K, V, FC = unknown>\n extends Pick<\n OptionsBase<K, V, FC>,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status<V>\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext<K, V, FC>\n extends MemoOptions<K, V, FC> {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<K, V>\n extends MemoOptions<K, V, undefined> {\n context?: undefined\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions<K, V, FC = unknown> {\n options: MemoizerMemoOptions<K, V, FC>\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoerOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions<K, V, FC = unknown>\n extends Pick<\n OptionsBase<K, V, FC>,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status<V>\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions<K, V, FC>\n extends Pick<OptionsBase<K, V, FC>, 'updateAgeOnHas'> {\n status?: Status<V>\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions<K, V, FC>\n extends Pick<\n OptionsBase<K, V, FC>,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status<V>\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions<K, V, FC>\n extends Pick<OptionsBase<K, V, FC>, 'allowStale'> {}\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions<K, V, FC>\n extends Pick<\n OptionsBase<K, V, FC>,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status<V>\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher<K, V, FC = unknown> = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions<K, V, FC>\n ) => Promise<V | undefined | void> | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer<K, V, FC = unknown> = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions<K, V, FC>\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase<K, V, FC> {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer<K, V>\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer<K, V>\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator<K, V>\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher<K, V, FC>\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer<K, V, FC>\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache<string, any>({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n }\n\n export interface OptionsMaxLimit<K, V, FC>\n extends OptionsBase<K, V, FC> {\n max: Count\n }\n export interface OptionsTTLLimit<K, V, FC>\n extends OptionsBase<K, V, FC> {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit<K, V, FC>\n extends OptionsBase<K, V, FC> {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options<K, V, FC> =\n | OptionsMaxLimit<K, V, FC>\n | OptionsSizeLimit<K, V, FC>\n | OptionsTTLLimit<K, V, FC>\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry<V> {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache<K extends {}, V extends {}, FC = unknown>\n implements Map<K, V>\n{\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer<K, V>\n readonly #disposeAfter?: LRUCache.Disposer<K, V>\n readonly #fetchMethod?: LRUCache.Fetcher<K, V, FC>\n readonly #memoMethod?: LRUCache.Memoizer<K, V, FC>\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator<K, V>\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map<K, Index>\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch<V> | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask<K, V>[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown\n >(c: LRUCache<K, V, FC>) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map<K, number>,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: any) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions<K, V, FC>,\n context: any\n ): BackgroundFetch<V> =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context\n ),\n moveToTail: (index: number): void =>\n c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) =>\n c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) =>\n c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher<K, V, FC> | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer<K, V, FC> | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(\n options: LRUCache.Options<K, V, FC> | LRUCache<K, V, FC>\n ) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n } = options\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize'\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (\n memoMethod !== undefined &&\n typeof memoMethod !== 'function'\n ) {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (\n fetchMethod !== undefined &&\n typeof fetchMethod !== 'function'\n ) {\n throw new TypeError(\n 'fetchMethod must be a function if specified'\n )\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = new Array(max).fill(undefined)\n this.#valList = new Array(max).fill(undefined)\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified'\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified'\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError(\n 'ttl must be a positive integer if specified'\n )\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required'\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore next */\n if (!ttl || !start) return\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(\n () => (cachedNow = 0),\n this.ttlResolution\n )\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status<V>, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)'\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.'\n )\n }\n }\n return size\n }\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status<V>\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - (sizes[index] as number)\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index] as number\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status<V>\n ) => void = (_i, _s, _st) => {}\n #requireSize: (\n k: K,\n v: V | BackgroundFetch<V>,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator<K, V>\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch<V>,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator<K, V>\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache'\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache<K, V, FC>) => boolean,\n getOptions: LRUCache.GetOptions<K, V, FC> = {}\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache<K, V, FC>) => any,\n thisp: any = this\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache<K, V, FC>) => any,\n thisp: any = this\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry<V> | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) return undefined\n const entry: LRUCache.Entry<V> = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRLUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry<V>][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry<V> = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry<V>][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = perf.now() - age\n }\n this.set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | BackgroundFetch<V> | undefined,\n setOptions: LRUCache.SetOptions<K, V, FC> = {}\n ) {\n if (v === undefined) {\n this.delete(k)\n return this\n }\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size\n ) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n } else {\n // update\n this.#moveToTail(index)\n const oldVal = this.#valList[index] as V | BackgroundFetch<V>\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'))\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s as V, k, 'set'])\n }\n }\n } else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal as V, k, 'set'])\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (status) {\n status.set = 'replace'\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n } else if (status) {\n status.set = 'update'\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask<K, V> | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask<K, V> | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head] as K\n const v = this.#valList[head] as V\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions<K, V, FC> = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } =\n hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions<K, V, FC> = {}) {\n const { allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (\n index === undefined ||\n (!allowStale && this.#isStale(index))\n ) {\n return\n }\n const v = this.#valList[index]\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions<K, V, FC>,\n context: any\n ): BackgroundFetch<V> {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AC()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (\n v: V | undefined,\n updateCache = false\n ): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch<V>\n if (this.#valList[index as Index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.set(k, v, fetchOpts.options)\n }\n }\n return v\n }\n\n const eb = (er: any) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er\n }\n return fetchFail(er)\n }\n\n const fetchFail = (er: any): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted =\n aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch<V>\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: any) => void\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (\n !options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort\n ) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch<V> = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: any): p is BackgroundFetch<V> {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch<V>\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise<sup>1</sup>,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : LRUCache.FetchOptionsWithContext<K, V, FC>\n ): Promise<undefined | V>\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : never\n ): Promise<undefined | V>\n\n async fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions<K, V, FC> = {}\n ): Promise<undefined | V> {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale =\n allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : LRUCache.FetchOptionsWithContext<K, V, FC>\n ): Promise<V>\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : never\n ): Promise<V>\n async forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions<K, V, FC> = {}\n ): Promise<V> {\n const v = await this.fetch(\n k,\n fetchOptions as unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : LRUCache.FetchOptionsWithContext<K, V, FC>\n )\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC\n ? LRUCache.MemoOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext<K, V>\n : LRUCache.MemoOptionsWithContext<K, V, FC>\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n memoOptions?: unknown extends FC\n ? LRUCache.MemoOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext<K, V>\n : never\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions<K, V, FC> = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, forceRefresh, ...options } = memoOptions\n const v = this.get(k, options)\n if (!forceRefresh && v !== undefined) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions<K, V, FC>)\n this.set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions<K, V, FC> = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n if (status) status.get = 'stale'\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status && allowStale) status.returnedStale = true\n return allowStale ? value : undefined\n } else {\n if (\n status &&\n allowStale &&\n value.__staleWhileFetching !== undefined\n ) {\n status.returnedStale = true\n }\n return allowStale ? value.__staleWhileFetching : undefined\n }\n } else {\n if (status) status.get = 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching\n }\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return value\n }\n } else if (status) {\n status.get = 'miss'\n }\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask<K, V> | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask<K, V> | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n","import { getEACAggregatorProxyContract } from '../eth/builtin/eacaggregatorproxy.js'\nimport fs from 'fs'\nimport { parse } from 'csv-parse/sync'\nimport { BlockTag } from 'ethers/providers'\nimport { scaleDown } from '../core/big-decimal.js'\nimport { EthChainId } from '@sentio/chain'\nimport { createRequire } from 'module'\nimport path from 'path'\n\ntype OralceRecord = {\n Pair: string\n Asset: string\n Type: string\n Address: string\n}\n\nexport enum PriceUnit {\n USD = 0,\n ETH = 1,\n BTC = 2\n}\n\nexport interface DexPriceResult {\n price?: number\n error?: string\n}\n\nexport function getPackageRoot(pkgId: string): string {\n const require = createRequire(import.meta.url)\n const m = require.resolve(pkgId)\n\n let dir = path.dirname(m)\n while (!fs.existsSync(path.join(dir, 'package.json'))) {\n dir = path.dirname(dir)\n }\n return dir\n}\n\n// Load price feed from https://docs.chain.link/docs/data-feeds/price-feeds/addresses/?network=ethereum\n// and then use EACAggregatorProxy contract to get price\nclass DexPrice {\n USD_ORACLE_MAP = new Map<string, string>()\n ETH_ORACLE_MAP = new Map<string, string>()\n BTC_ORACLE_MAP = new Map<string, string>()\n ASSETS_INFOS = new Map<string, number>()\n\n readonly chainId: EthChainId\n\n constructor(csvFileName: string, chainId: EthChainId) {\n this.chainId = chainId\n const packageRoot = getPackageRoot('@sentio/sdk')\n const csvFilePath = path.join(packageRoot, 'src', 'utils', csvFileName)\n const fileContent = fs.readFileSync(csvFilePath, { encoding: 'utf-8' })\n const headers = ['Pair', 'Asset', 'Type', 'Address']\n\n const records: OralceRecord[] = parse(fileContent, {\n delimiter: ',',\n columns: headers,\n skip_empty_lines: true\n })\n\n for (const record of records) {\n const pair = record.Pair.split('/')\n const asset = pair[0].trim().toLowerCase()\n const target = pair[1].trim().toLowerCase()\n const address = record.Address.toLowerCase()\n if (target === 'usd') {\n this.USD_ORACLE_MAP.set(asset, address)\n } else if (target === 'eth') {\n this.ETH_ORACLE_MAP.set(asset, address)\n } else if (target == 'btc') {\n this.BTC_ORACLE_MAP.set(asset, address)\n } else {\n console.error('wrong asset record:' + JSON.stringify(record))\n }\n\n // console.log(asset, target, address)\n }\n }\n\n // asset: symbol of the asset\n // unit: usd, eth or btc\n // blockTag: blockNumber of block symbol like \"latest\"\n // returns the asset price,\n // throw exception if calling to price feed failed, e.g. due to a invalid block number\n async getPrice(\n asset: string,\n blockTag: BlockTag = 'latest',\n unit: PriceUnit = PriceUnit.USD\n ): Promise<DexPriceResult> {\n // if (chainId !== 1 && chainId !== 5) {\n // return {\n // error: \"current dex price only support chain 1 (mainnet) or 5 (goerli)\"\n // }\n // }\n\n let oracleMap = this.USD_ORACLE_MAP\n switch (unit) {\n case PriceUnit.ETH:\n oracleMap = this.ETH_ORACLE_MAP\n break\n case PriceUnit.BTC:\n oracleMap = this.BTC_ORACLE_MAP\n break\n default:\n }\n\n asset = asset.trim().toLowerCase()\n\n const addr = oracleMap.get(asset)\n if (!addr) {\n return {\n error: 'No price feed found for asset'\n }\n }\n\n const contract = getEACAggregatorProxyContract(this.chainId, addr)\n try {\n const price = await contract.latestAnswer({\n blockTag: blockTag\n })\n\n let decimal = this.ASSETS_INFOS.get(asset)\n if (!decimal) {\n decimal = Number(await contract.decimals())\n this.ASSETS_INFOS.set(asset, decimal)\n }\n\n return {\n price: scaleDown(price, decimal).toNumber()\n }\n } catch (e) {\n return {\n error:\n 'Price query error for ' +\n asset +\n ' failed at ' +\n addr +\n ' at chain ' +\n this.chainId +\n '. Details: ' +\n e.toString()\n }\n }\n }\n}\n\nexport const EthereumDexPrice = new DexPrice('chainlink-oracles.csv', EthChainId.ETHEREUM)\nexport const SepoliaDexPrice = new DexPrice('chainlink-oracles-sepolia.csv', EthChainId.SEPOLIA)\n;process.stdout.write(\"\");","\nclass CsvError extends Error {\n constructor(code, message, options, ...contexts) {\n if(Array.isArray(message)) message = message.join(' ').trim();\n super(message);\n if(Error.captureStackTrace !== undefined){\n Error.captureStackTrace(this, CsvError);\n }\n this.code = code;\n for(const context of contexts){\n for(const key in context){\n const value = context[key];\n this[key] = Buffer.isBuffer(value) ? value.toString(options.encoding) : value == null ? value : JSON.parse(JSON.stringify(value));\n }\n }\n }\n}\n\nexport {CsvError};\n","\nconst is_object = function(obj){\n return (typeof obj === 'object' && obj !== null && !Array.isArray(obj));\n};\n\nexport {is_object};\n","\nimport {CsvError} from './CsvError.js';\nimport {is_object} from '../utils/is_object.js';\n\nconst normalize_columns_array = function(columns){\n const normalizedColumns = [];\n for(let i = 0, l = columns.length; i < l; i++){\n const column = columns[i];\n if(column === undefined || column === null || column === false){\n normalizedColumns[i] = { disabled: true };\n }else if(typeof column === 'string'){\n normalizedColumns[i] = { name: column };\n }else if(is_object(column)){\n if(typeof column.name !== 'string'){\n throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', [\n 'Option columns missing name:',\n `property \"name\" is required at position ${i}`,\n 'when column is an object literal'\n ]);\n }\n normalizedColumns[i] = column;\n }else{\n throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', [\n 'Invalid column definition:',\n 'expect a string or a literal object,',\n `got ${JSON.stringify(column)} at position ${i}`\n ]);\n }\n }\n return normalizedColumns;\n};\n\nexport {normalize_columns_array};\n","\nclass ResizeableBuffer{\n constructor(size=100){\n this.size = size;\n this.length = 0;\n this.buf = Buffer.allocUnsafe(size);\n }\n prepend(val){\n if(Buffer.isBuffer(val)){\n const length = this.length + val.length;\n if(length >= this.size){\n this.resize();\n if(length >= this.size){\n throw Error('INVALID_BUFFER_STATE');\n }\n }\n const buf = this.buf;\n this.buf = Buffer.allocUnsafe(this.size);\n val.copy(this.buf, 0);\n buf.copy(this.buf, val.length);\n this.length += val.length;\n }else{\n const length = this.length++;\n if(length === this.size){\n this.resize();\n }\n const buf = this.clone();\n this.buf[0] = val;\n buf.copy(this.buf,1, 0, length);\n }\n }\n append(val){\n const length = this.length++;\n if(length === this.size){\n this.resize();\n }\n this.buf[length] = val;\n }\n clone(){\n return Buffer.from(this.buf.slice(0, this.length));\n }\n resize(){\n const length = this.length;\n this.size = this.size * 2;\n const buf = Buffer.allocUnsafe(this.size);\n this.buf.copy(buf,0, 0, length);\n this.buf = buf;\n }\n toString(encoding){\n if(encoding){\n return this.buf.slice(0, this.length).toString(encoding);\n }else{\n return Uint8Array.prototype.slice.call(this.buf.slice(0, this.length));\n }\n }\n toJSON(){\n return this.toString('utf8');\n }\n reset(){\n this.length = 0;\n }\n}\n\nexport default ResizeableBuffer;\n","\nimport ResizeableBuffer from '../utils/ResizeableBuffer.js';\n\n// white space characters\n// https://en.wikipedia.org/wiki/Whitespace_character\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes#Types\n// \\f\\n\\r\\t\\v\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff\nconst np = 12;\nconst cr = 13; // `\\r`, carriage return, 0x0D in hexadécimal, 13 in decimal\nconst nl = 10; // `\\n`, newline, 0x0A in hexadecimal, 10 in decimal\nconst space = 32;\nconst tab = 9;\n\nconst init_state = function(options){\n return {\n bomSkipped: false,\n bufBytesStart: 0,\n castField: options.cast_function,\n commenting: false,\n // Current error encountered by a record\n error: undefined,\n enabled: options.from_line === 1,\n escaping: false,\n escapeIsQuote: Buffer.isBuffer(options.escape) && Buffer.isBuffer(options.quote) && Buffer.compare(options.escape, options.quote) === 0,\n // columns can be `false`, `true`, `Array`\n expectedRecordLength: Array.isArray(options.columns) ? options.columns.length : undefined,\n field: new ResizeableBuffer(20),\n firstLineToHeaders: options.cast_first_line_to_header,\n needMoreDataSize: Math.max(\n // Skip if the remaining buffer smaller than comment\n options.comment !== null ? options.comment.length : 0,\n // Skip if the remaining buffer can be delimiter\n ...options.delimiter.map((delimiter) => delimiter.length),\n // Skip if the remaining buffer can be escape sequence\n options.quote !== null ? options.quote.length : 0,\n ),\n previousBuf: undefined,\n quoting: false,\n stop: false,\n rawBuffer: new ResizeableBuffer(100),\n record: [],\n recordHasError: false,\n record_length: 0,\n recordDelimiterMaxLength: options.record_delimiter.length === 0 ? 0 : Math.max(...options.record_delimiter.map((v) => v.length)),\n trimChars: [Buffer.from(' ', options.encoding)[0], Buffer.from('\\t', options.encoding)[0]],\n wasQuoting: false,\n wasRowDelimiter: false,\n timchars: [\n Buffer.from(Buffer.from([cr], 'utf8').toString(), options.encoding),\n Buffer.from(Buffer.from([nl], 'utf8').toString(), options.encoding),\n Buffer.from(Buffer.from([np], 'utf8').toString(), options.encoding),\n Buffer.from(Buffer.from([space], 'utf8').toString(), options.encoding),\n Buffer.from(Buffer.from([tab], 'utf8').toString(), options.encoding),\n ]\n };\n};\n\nexport {init_state};\n","\nconst underscore = function(str){\n return str.replace(/([A-Z])/g, function(_, match){\n return '_' + match.toLowerCase();\n });\n};\n\nexport {underscore};\n","\nimport {normalize_columns_array} from './normalize_columns_array.js';\nimport {CsvError} from './CsvError.js';\nimport {underscore} from '../utils/underscore.js';\n\nconst normalize_options = function(opts){\n const options = {};\n // Merge with user options\n for(const opt in opts){\n options[underscore(opt)] = opts[opt];\n }\n // Normalize option `encoding`\n // Note: defined first because other options depends on it\n // to convert chars/strings into buffers.\n if(options.encoding === undefined || options.encoding === true){\n options.encoding = 'utf8';\n }else if(options.encoding === null || options.encoding === false){\n options.encoding = null;\n }else if(typeof options.encoding !== 'string' && options.encoding !== null){\n throw new CsvError('CSV_INVALID_OPTION_ENCODING', [\n 'Invalid option encoding:',\n 'encoding must be a string or null to return a buffer,',\n `got ${JSON.stringify(options.encoding)}`\n ], options);\n }\n // Normalize option `bom`\n if(options.bom === undefined || options.bom === null || options.bom === false){\n options.bom = false;\n }else if(options.bom !== true){\n throw new CsvError('CSV_INVALID_OPTION_BOM', [\n 'Invalid option bom:', 'bom must be true,',\n `got ${JSON.stringify(options.bom)}`\n ], options);\n }\n // Normalize option `cast`\n options.cast_function = null;\n if(options.cast === undefined || options.cast === null || options.cast === false || options.cast === ''){\n options.cast = undefined;\n }else if(typeof options.cast === 'function'){\n options.cast_function = options.cast;\n options.cast = true;\n }else if(options.cast !== true){\n throw new CsvError('CSV_INVALID_OPTION_CAST', [\n 'Invalid option cast:', 'cast must be true or a function,',\n `got ${JSON.stringify(options.cast)}`\n ], options);\n }\n // Normalize option `cast_date`\n if(options.cast_date === undefined || options.cast_date === null || options.cast_date === false || options.cast_date === ''){\n options.cast_date = false;\n }else if(options.cast_date === true){\n options.cast_date = function(value){\n const date = Date.parse(value);\n return !isNaN(date) ? new Date(date) : value;\n };\n }else if (typeof options.cast_date !== 'function'){\n throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', [\n 'Invalid option cast_date:', 'cast_date must be true or a function,',\n `got ${JSON.stringify(options.cast_date)}`\n ], options);\n }\n // Normalize option `columns`\n options.cast_first_line_to_header = null;\n if(options.columns === true){\n // Fields in the first line are converted as-is to columns\n options.cast_first_line_to_header = undefined;\n }else if(typeof options.columns === 'function'){\n options.cast_first_line_to_header = options.columns;\n options.columns = true;\n }else if(Array.isArray(options.columns)){\n options.columns = normalize_columns_array(options.columns);\n }else if(options.columns === undefined || options.columns === null || options.columns === false){\n options.columns = false;\n }else{\n throw new CsvError('CSV_INVALID_OPTION_COLUMNS', [\n 'Invalid option columns:',\n 'expect an array, a function or true,',\n `got ${JSON.stringify(options.columns)}`\n ], options);\n }\n // Normalize option `group_columns_by_name`\n if(options.group_columns_by_name === undefined || options.group_columns_by_name === null || options.group_columns_by_name === false){\n options.group_columns_by_name = false;\n }else if(options.group_columns_by_name !== true){\n throw new CsvError('CSV_INVALID_OPTION_GROUP_COLUMNS_BY_NAME', [\n 'Invalid option group_columns_by_name:',\n 'expect an boolean,',\n `got ${JSON.stringify(options.group_columns_by_name)}`\n ], options);\n }else if(options.columns === false){\n throw new CsvError('CSV_INVALID_OPTION_GROUP_COLUMNS_BY_NAME', [\n 'Invalid option group_columns_by_name:',\n 'the `columns` mode must be activated.'\n ], options);\n }\n // Normalize option `comment`\n if(options.comment === undefined || options.comment === null || options.comment === false || options.comment === ''){\n options.comment = null;\n }else{\n if(typeof options.comment === 'string'){\n options.comment = Buffer.from(options.comment, options.encoding);\n }\n if(!Buffer.isBuffer(options.comment)){\n throw new CsvError('CSV_INVALID_OPTION_COMMENT', [\n 'Invalid option comment:',\n 'comment must be a buffer or a string,',\n `got ${JSON.stringify(options.comment)}`\n ], options);\n }\n }\n // Normalize option `comment_no_infix`\n if(options.comment_no_infix === undefined || options.comment_no_infix === null || options.comment_no_infix === false){\n options.comment_no_infix = false;\n }else if(options.comment_no_infix !== true){\n throw new CsvError('CSV_INVALID_OPTION_COMMENT', [\n 'Invalid option comment_no_infix:',\n 'value must be a boolean,',\n `got ${JSON.stringify(options.comment_no_infix)}`\n ], options);\n }\n // Normalize option `delimiter`\n const delimiter_json = JSON.stringify(options.delimiter);\n if(!Array.isArray(options.delimiter)) options.delimiter = [options.delimiter];\n if(options.delimiter.length === 0){\n throw new CsvError('CSV_INVALID_OPTION_DELIMITER', [\n 'Invalid option delimiter:',\n 'delimiter must be a non empty string or buffer or array of string|buffer,',\n `got ${delimiter_json}`\n ], options);\n }\n options.delimiter = options.delimiter.map(function(delimiter){\n if(delimiter === undefined || delimiter === null || delimiter === false){\n return Buffer.from(',', options.encoding);\n }\n if(typeof delimiter === 'string'){\n delimiter = Buffer.from(delimiter, options.encoding);\n }\n if(!Buffer.isBuffer(delimiter) || delimiter.length === 0){\n throw new CsvError('CSV_INVALID_OPTION_DELIMITER', [\n 'Invalid option delimiter:',\n 'delimiter must be a non empty string or buffer or array of string|buffer,',\n `got ${delimiter_json}`\n ], options);\n }\n return delimiter;\n });\n // Normalize option `escape`\n if(options.escape === undefined || options.escape === true){\n options.escape = Buffer.from('\"', options.encoding);\n }else if(typeof options.escape === 'string'){\n options.escape = Buffer.from(options.escape, options.encoding);\n }else if (options.escape === null || options.escape === false){\n options.escape = null;\n }\n if(options.escape !== null){\n if(!Buffer.isBuffer(options.escape)){\n throw new Error(`Invalid Option: escape must be a buffer, a string or a boolean, got ${JSON.stringify(options.escape)}`);\n }\n }\n // Normalize option `from`\n if(options.from === undefined || options.from === null){\n options.from = 1;\n }else{\n if(typeof options.from === 'string' && /\\d+/.test(options.from)){\n options.from = parseInt(options.from);\n }\n if(Number.isInteger(options.from)){\n if(options.from < 0){\n throw new Error(`Invalid Option: from must be a positive integer, got ${JSON.stringify(opts.from)}`);\n }\n }else{\n throw new Error(`Invalid Option: from must be an integer, got ${JSON.stringify(options.from)}`);\n }\n }\n // Normalize option `from_line`\n if(options.from_line === undefined || options.from_line === null){\n options.from_line = 1;\n }else{\n if(typeof options.from_line === 'string' && /\\d+/.test(options.from_line)){\n options.from_line = parseInt(options.from_line);\n }\n if(Number.isInteger(options.from_line)){\n if(options.from_line <= 0){\n throw new Error(`Invalid Option: from_line must be a positive integer greater than 0, got ${JSON.stringify(opts.from_line)}`);\n }\n }else{\n throw new Error(`Invalid Option: from_line must be an integer, got ${JSON.stringify(opts.from_line)}`);\n }\n }\n // Normalize options `ignore_last_delimiters`\n if(options.ignore_last_delimiters === undefined || options.ignore_last_delimiters === null){\n options.ignore_last_delimiters = false;\n }else if(typeof options.ignore_last_delimiters === 'number'){\n options.ignore_last_delimiters = Math.floor(options.ignore_last_delimiters);\n if(options.ignore_last_delimiters === 0){\n options.ignore_last_delimiters = false;\n }\n }else if(typeof options.ignore_last_delimiters !== 'boolean'){\n throw new CsvError('CSV_INVALID_OPTION_IGNORE_LAST_DELIMITERS', [\n 'Invalid option `ignore_last_delimiters`:',\n 'the value must be a boolean value or an integer,',\n `got ${JSON.stringify(options.ignore_last_delimiters)}`\n ], options);\n }\n if(options.ignore_last_delimiters === true && options.columns === false){\n throw new CsvError('CSV_IGNORE_LAST_DELIMITERS_REQUIRES_COLUMNS', [\n 'The option `ignore_last_delimiters`',\n 'requires the activation of the `columns` option'\n ], options);\n }\n // Normalize option `info`\n if(options.info === undefined || options.info === null || options.info === false){\n options.info = false;\n }else if(options.info !== true){\n throw new Error(`Invalid Option: info must be true, got ${JSON.stringify(options.info)}`);\n }\n // Normalize option `max_record_size`\n if(options.max_record_size === undefined || options.max_record_size === null || options.max_record_size === false){\n options.max_record_size = 0;\n }else if(Number.isInteger(options.max_record_size) && options.max_record_size >= 0){\n // Great, nothing to do\n }else if(typeof options.max_record_size === 'string' && /\\d+/.test(options.max_record_size)){\n options.max_record_size = parseInt(options.max_record_size);\n }else{\n throw new Error(`Invalid Option: max_record_size must be a positive integer, got ${JSON.stringify(options.max_record_size)}`);\n }\n // Normalize option `objname`\n if(options.objname === undefined || options.objname === null || options.objname === false){\n options.objname = undefined;\n }else if(Buffer.isBuffer(options.objname)){\n if(options.objname.length === 0){\n throw new Error(`Invalid Option: objname must be a non empty buffer`);\n }\n if(options.encoding === null){\n // Don't call `toString`, leave objname as a buffer\n }else{\n options.objname = options.objname.toString(options.encoding);\n }\n }else if(typeof options.objname === 'string'){\n if(options.objname.length === 0){\n throw new Error(`Invalid Option: objname must be a non empty string`);\n }\n // Great, nothing to do\n }else if(typeof options.objname === 'number'){\n // if(options.objname.length === 0){\n // throw new Error(`Invalid Option: objname must be a non empty string`);\n // }\n // Great, nothing to do\n }else{\n throw new Error(`Invalid Option: objname must be a string or a buffer, got ${options.objname}`);\n }\n if(options.objname !== undefined){\n if(typeof options.objname === 'number'){\n if(options.columns !== false){\n throw Error('Invalid Option: objname index cannot be combined with columns or be defined as a field');\n }\n }else{ // A string or a buffer\n if(options.columns === false){\n throw Error('Invalid Option: objname field must be combined with columns or be defined as an index');\n }\n }\n }\n // Normalize option `on_record`\n if(options.on_record === undefined || options.on_record === null){\n options.on_record = undefined;\n }else if(typeof options.on_record !== 'function'){\n throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', [\n 'Invalid option `on_record`:',\n 'expect a function,',\n `got ${JSON.stringify(options.on_record)}`\n ], options);\n }\n // Normalize option `on_skip`\n // options.on_skip ??= (err, chunk) => {\n // this.emit('skip', err, chunk);\n // };\n if(options.on_skip !== undefined && options.on_skip !== null && typeof options.on_skip !== 'function'){\n throw new Error(`Invalid Option: on_skip must be a function, got ${JSON.stringify(options.on_skip)}`);\n }\n // Normalize option `quote`\n if(options.quote === null || options.quote === false || options.quote === ''){\n options.quote = null;\n }else{\n if(options.quote === undefined || options.quote === true){\n options.quote = Buffer.from('\"', options.encoding);\n }else if(typeof options.quote === 'string'){\n options.quote = Buffer.from(options.quote, options.encoding);\n }\n if(!Buffer.isBuffer(options.quote)){\n throw new Error(`Invalid Option: quote must be a buffer or a string, got ${JSON.stringify(options.quote)}`);\n }\n }\n // Normalize option `raw`\n if(options.raw === undefined || options.raw === null || options.raw === false){\n options.raw = false;\n }else if(options.raw !== true){\n throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);\n }\n // Normalize option `record_delimiter`\n if(options.record_delimiter === undefined){\n options.record_delimiter = [];\n }else if(typeof options.record_delimiter === 'string' || Buffer.isBuffer(options.record_delimiter)){\n if(options.record_delimiter.length === 0){\n throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [\n 'Invalid option `record_delimiter`:',\n 'value must be a non empty string or buffer,',\n `got ${JSON.stringify(options.record_delimiter)}`\n ], options);\n }\n options.record_delimiter = [options.record_delimiter];\n }else if(!Array.isArray(options.record_delimiter)){\n throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [\n 'Invalid option `record_delimiter`:',\n 'value must be a string, a buffer or array of string|buffer,',\n `got ${JSON.stringify(options.record_delimiter)}`\n ], options);\n }\n options.record_delimiter = options.record_delimiter.map(function(rd, i){\n if(typeof rd !== 'string' && ! Buffer.isBuffer(rd)){\n throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [\n 'Invalid option `record_delimiter`:',\n 'value must be a string, a buffer or array of string|buffer',\n `at index ${i},`,\n `got ${JSON.stringify(rd)}`\n ], options);\n }else if(rd.length === 0){\n throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [\n 'Invalid option `record_delimiter`:',\n 'value must be a non empty string or buffer',\n `at index ${i},`,\n `got ${JSON.stringify(rd)}`\n ], options);\n }\n if(typeof rd === 'string'){\n rd = Buffer.from(rd, options.encoding);\n }\n return rd;\n });\n // Normalize option `relax_column_count`\n if(typeof options.relax_column_count === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count === undefined || options.relax_column_count === null){\n options.relax_column_count = false;\n }else{\n throw new Error(`Invalid Option: relax_column_count must be a boolean, got ${JSON.stringify(options.relax_column_count)}`);\n }\n if(typeof options.relax_column_count_less === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count_less === undefined || options.relax_column_count_less === null){\n options.relax_column_count_less = false;\n }else{\n throw new Error(`Invalid Option: relax_column_count_less must be a boolean, got ${JSON.stringify(options.relax_column_count_less)}`);\n }\n if(typeof options.relax_column_count_more === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count_more === undefined || options.relax_column_count_more === null){\n options.relax_column_count_more = false;\n }else{\n throw new Error(`Invalid Option: relax_column_count_more must be a boolean, got ${JSON.stringify(options.relax_column_count_more)}`);\n }\n // Normalize option `relax_quotes`\n if(typeof options.relax_quotes === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_quotes === undefined || options.relax_quotes === null){\n options.relax_quotes = false;\n }else{\n throw new Error(`Invalid Option: relax_quotes must be a boolean, got ${JSON.stringify(options.relax_quotes)}`);\n }\n // Normalize option `skip_empty_lines`\n if(typeof options.skip_empty_lines === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_empty_lines === undefined || options.skip_empty_lines === null){\n options.skip_empty_lines = false;\n }else{\n throw new Error(`Invalid Option: skip_empty_lines must be a boolean, got ${JSON.stringify(options.skip_empty_lines)}`);\n }\n // Normalize option `skip_records_with_empty_values`\n if(typeof options.skip_records_with_empty_values === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_records_with_empty_values === undefined || options.skip_records_with_empty_values === null){\n options.skip_records_with_empty_values = false;\n }else{\n throw new Error(`Invalid Option: skip_records_with_empty_values must be a boolean, got ${JSON.stringify(options.skip_records_with_empty_values)}`);\n }\n // Normalize option `skip_records_with_error`\n if(typeof options.skip_records_with_error === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_records_with_error === undefined || options.skip_records_with_error === null){\n options.skip_records_with_error = false;\n }else{\n throw new Error(`Invalid Option: skip_records_with_error must be a boolean, got ${JSON.stringify(options.skip_records_with_error)}`);\n }\n // Normalize option `rtrim`\n if(options.rtrim === undefined || options.rtrim === null || options.rtrim === false){\n options.rtrim = false;\n }else if(options.rtrim !== true){\n throw new Error(`Invalid Option: rtrim must be a boolean, got ${JSON.stringify(options.rtrim)}`);\n }\n // Normalize option `ltrim`\n if(options.ltrim === undefined || options.ltrim === null || options.ltrim === false){\n options.ltrim = false;\n }else if(options.ltrim !== true){\n throw new Error(`Invalid Option: ltrim must be a boolean, got ${JSON.stringify(options.ltrim)}`);\n }\n // Normalize option `trim`\n if(options.trim === undefined || options.trim === null || options.trim === false){\n options.trim = false;\n }else if(options.trim !== true){\n throw new Error(`Invalid Option: trim must be a boolean, got ${JSON.stringify(options.trim)}`);\n }\n // Normalize options `trim`, `ltrim` and `rtrim`\n if(options.trim === true && opts.ltrim !== false){\n options.ltrim = true;\n }else if(options.ltrim !== true){\n options.ltrim = false;\n }\n if(options.trim === true && opts.rtrim !== false){\n options.rtrim = true;\n }else if(options.rtrim !== true){\n options.rtrim = false;\n }\n // Normalize option `to`\n if(options.to === undefined || options.to === null){\n options.to = -1;\n }else{\n if(typeof options.to === 'string' && /\\d+/.test(options.to)){\n options.to = parseInt(options.to);\n }\n if(Number.isInteger(options.to)){\n if(options.to <= 0){\n throw new Error(`Invalid Option: to must be a positive integer greater than 0, got ${JSON.stringify(opts.to)}`);\n }\n }else{\n throw new Error(`Invalid Option: to must be an integer, got ${JSON.stringify(opts.to)}`);\n }\n }\n // Normalize option `to_line`\n if(options.to_line === undefined || options.to_line === null){\n options.to_line = -1;\n }else{\n if(typeof options.to_line === 'string' && /\\d+/.test(options.to_line)){\n options.to_line = parseInt(options.to_line);\n }\n if(Number.isInteger(options.to_line)){\n if(options.to_line <= 0){\n throw new Error(`Invalid Option: to_line must be a positive integer greater than 0, got ${JSON.stringify(opts.to_line)}`);\n }\n }else{\n throw new Error(`Invalid Option: to_line must be an integer, got ${JSON.stringify(opts.to_line)}`);\n }\n }\n return options;\n};\n\nexport {normalize_options};\n","\nimport {normalize_columns_array} from './normalize_columns_array.js';\nimport {init_state} from './init_state.js';\nimport {normalize_options} from './normalize_options.js';\nimport {CsvError} from './CsvError.js';\n\nconst isRecordEmpty = function(record){\n return record.every((field) => field == null || field.toString && field.toString().trim() === '');\n};\n\nconst cr = 13; // `\\r`, carriage return, 0x0D in hexadécimal, 13 in decimal\nconst nl = 10; // `\\n`, newline, 0x0A in hexadecimal, 10 in decimal\n\nconst boms = {\n // Note, the following are equals:\n // Buffer.from(\"\\ufeff\")\n // Buffer.from([239, 187, 191])\n // Buffer.from('EFBBBF', 'hex')\n 'utf8': Buffer.from([239, 187, 191]),\n // Note, the following are equals:\n // Buffer.from \"\\ufeff\", 'utf16le\n // Buffer.from([255, 254])\n 'utf16le': Buffer.from([255, 254])\n};\n\nconst transform = function(original_options = {}) {\n const info = {\n bytes: 0,\n comment_lines: 0,\n empty_lines: 0,\n invalid_field_length: 0,\n lines: 1,\n records: 0\n };\n const options = normalize_options(original_options);\n return {\n info: info,\n original_options: original_options,\n options: options,\n state: init_state(options),\n __needMoreData: function(i, bufLen, end){\n if(end) return false;\n const {encoding, escape, quote} = this.options;\n const {quoting, needMoreDataSize, recordDelimiterMaxLength} = this.state;\n const numOfCharLeft = bufLen - i - 1;\n const requiredLength = Math.max(\n needMoreDataSize,\n // Skip if the remaining buffer smaller than record delimiter\n // If \"record_delimiter\" is yet to be discovered:\n // 1. It is equals to `[]` and \"recordDelimiterMaxLength\" equals `0`\n // 2. We set the length to windows line ending in the current encoding\n // Note, that encoding is known from user or bom discovery at that point\n // recordDelimiterMaxLength,\n recordDelimiterMaxLength === 0 ? Buffer.from('\\r\\n', encoding).length : recordDelimiterMaxLength,\n // Skip if remaining buffer can be an escaped quote\n quoting ? ((escape === null ? 0 : escape.length) + quote.length) : 0,\n // Skip if remaining buffer can be record delimiter following the closing quote\n quoting ? (quote.length + recordDelimiterMaxLength) : 0,\n );\n return numOfCharLeft < requiredLength;\n },\n // Central parser implementation\n parse: function(nextBuf, end, push, close){\n const {bom, comment_no_infix, encoding, from_line, ltrim, max_record_size,raw, relax_quotes, rtrim, skip_empty_lines, to, to_line} = this.options;\n let {comment, escape, quote, record_delimiter} = this.options;\n const {bomSkipped, previousBuf, rawBuffer, escapeIsQuote} = this.state;\n let buf;\n if(previousBuf === undefined){\n if(nextBuf === undefined){\n // Handle empty string\n close();\n return;\n }else{\n buf = nextBuf;\n }\n }else if(previousBuf !== undefined && nextBuf === undefined){\n buf = previousBuf;\n }else{\n buf = Buffer.concat([previousBuf, nextBuf]);\n }\n // Handle UTF BOM\n if(bomSkipped === false){\n if(bom === false){\n this.state.bomSkipped = true;\n }else if(buf.length < 3){\n // No enough data\n if(end === false){\n // Wait for more data\n this.state.previousBuf = buf;\n return;\n }\n }else{\n for(const encoding in boms){\n if(boms[encoding].compare(buf, 0, boms[encoding].length) === 0){\n // Skip BOM\n const bomLength = boms[encoding].length;\n this.state.bufBytesStart += bomLength;\n buf = buf.slice(bomLength);\n // Renormalize original options with the new encoding\n this.options = normalize_options({...this.original_options, encoding: encoding});\n // Options will re-evaluate the Buffer with the new encoding\n ({comment, escape, quote } = this.options);\n break;\n }\n }\n this.state.bomSkipped = true;\n }\n }\n const bufLen = buf.length;\n let pos;\n for(pos = 0; pos < bufLen; pos++){\n // Ensure we get enough space to look ahead\n // There should be a way to move this out of the loop\n if(this.__needMoreData(pos, bufLen, end)){\n break;\n }\n if(this.state.wasRowDelimiter === true){\n this.info.lines++;\n this.state.wasRowDelimiter = false;\n }\n if(to_line !== -1 && this.info.lines > to_line){\n this.state.stop = true;\n close();\n return;\n }\n // Auto discovery of record_delimiter, unix, mac and windows supported\n if(this.state.quoting === false && record_delimiter.length === 0){\n const record_delimiterCount = this.__autoDiscoverRecordDelimiter(buf, pos);\n if(record_delimiterCount){\n record_delimiter = this.options.record_delimiter;\n }\n }\n const chr = buf[pos];\n if(raw === true){\n rawBuffer.append(chr);\n }\n if((chr === cr || chr === nl) && this.state.wasRowDelimiter === false){\n this.state.wasRowDelimiter = true;\n }\n // Previous char was a valid escape char\n // treat the current char as a regular char\n if(this.state.escaping === true){\n this.state.escaping = false;\n }else{\n // Escape is only active inside quoted fields\n // We are quoting, the char is an escape chr and there is a chr to escape\n // if(escape !== null && this.state.quoting === true && chr === escape && pos + 1 < bufLen){\n if(escape !== null && this.state.quoting === true && this.__isEscape(buf, pos, chr) && pos + escape.length < bufLen){\n if(escapeIsQuote){\n if(this.__isQuote(buf, pos+escape.length)){\n this.state.escaping = true;\n pos += escape.length - 1;\n continue;\n }\n }else{\n this.state.escaping = true;\n pos += escape.length - 1;\n continue;\n }\n }\n // Not currently escaping and chr is a quote\n // TODO: need to compare bytes instead of single char\n if(this.state.commenting === false && this.__isQuote(buf, pos)){\n if(this.state.quoting === true){\n const nextChr = buf[pos+quote.length];\n const isNextChrTrimable = rtrim && this.__isCharTrimable(buf, pos+quote.length);\n const isNextChrComment = comment !== null && this.__compareBytes(comment, buf, pos+quote.length, nextChr);\n const isNextChrDelimiter = this.__isDelimiter(buf, pos+quote.length, nextChr);\n const isNextChrRecordDelimiter = record_delimiter.length === 0 ? this.__autoDiscoverRecordDelimiter(buf, pos+quote.length) : this.__isRecordDelimiter(nextChr, buf, pos+quote.length);\n // Escape a quote\n // Treat next char as a regular character\n if(escape !== null && this.__isEscape(buf, pos, chr) && this.__isQuote(buf, pos + escape.length)){\n pos += escape.length - 1;\n }else if(!nextChr || isNextChrDelimiter || isNextChrRecordDelimiter || isNextChrComment || isNextChrTrimable){\n this.state.quoting = false;\n this.state.wasQuoting = true;\n pos += quote.length - 1;\n continue;\n }else if(relax_quotes === false){\n const err = this.__error(\n new CsvError('CSV_INVALID_CLOSING_QUOTE', [\n 'Invalid Closing Quote:',\n `got \"${String.fromCharCode(nextChr)}\"`,\n `at line ${this.info.lines}`,\n 'instead of delimiter, record delimiter, trimable character',\n '(if activated) or comment',\n ], this.options, this.__infoField())\n );\n if(err !== undefined) return err;\n }else{\n this.state.quoting = false;\n this.state.wasQuoting = true;\n this.state.field.prepend(quote);\n pos += quote.length - 1;\n }\n }else{\n if(this.state.field.length !== 0){\n // In relax_quotes mode, treat opening quote preceded by chrs as regular\n if(relax_quotes === false){\n const info = this.__infoField();\n const bom = Object.keys(boms).map(b => boms[b].equals(this.state.field.toString()) ? b : false).filter(Boolean)[0];\n const err = this.__error(\n new CsvError('INVALID_OPENING_QUOTE', [\n 'Invalid Opening Quote:',\n `a quote is found on field ${JSON.stringify(info.column)} at line ${info.lines}, value is ${JSON.stringify(this.state.field.toString(encoding))}`,\n bom ? `(${bom} bom)` : undefined\n ], this.options, info, {\n field: this.state.field,\n })\n );\n if(err !== undefined) return err;\n }\n }else{\n this.state.quoting = true;\n pos += quote.length - 1;\n continue;\n }\n }\n }\n if(this.state.quoting === false){\n const recordDelimiterLength = this.__isRecordDelimiter(chr, buf, pos);\n if(recordDelimiterLength !== 0){\n // Do not emit comments which take a full line\n const skipCommentLine = this.state.commenting && (this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0);\n if(skipCommentLine){\n this.info.comment_lines++;\n // Skip full comment line\n }else{\n // Activate records emition if above from_line\n if(this.state.enabled === false && this.info.lines + (this.state.wasRowDelimiter === true ? 1: 0) >= from_line){\n this.state.enabled = true;\n this.__resetField();\n this.__resetRecord();\n pos += recordDelimiterLength - 1;\n continue;\n }\n // Skip if line is empty and skip_empty_lines activated\n if(skip_empty_lines === true && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0){\n this.info.empty_lines++;\n pos += recordDelimiterLength - 1;\n continue;\n }\n this.info.bytes = this.state.bufBytesStart + pos;\n const errField = this.__onField();\n if(errField !== undefined) return errField;\n this.info.bytes = this.state.bufBytesStart + pos + recordDelimiterLength;\n const errRecord = this.__onRecord(push);\n if(errRecord !== undefined) return errRecord;\n if(to !== -1 && this.info.records >= to){\n this.state.stop = true;\n close();\n return;\n }\n }\n this.state.commenting = false;\n pos += recordDelimiterLength - 1;\n continue;\n }\n if(this.state.commenting){\n continue;\n }\n if(comment !== null && (comment_no_infix === false || (this.state.record.length === 0 && this.state.field.length === 0))) {\n const commentCount = this.__compareBytes(comment, buf, pos, chr);\n if(commentCount !== 0){\n this.state.commenting = true;\n continue;\n }\n }\n const delimiterLength = this.__isDelimiter(buf, pos, chr);\n if(delimiterLength !== 0){\n this.info.bytes = this.state.bufBytesStart + pos;\n const errField = this.__onField();\n if(errField !== undefined) return errField;\n pos += delimiterLength - 1;\n continue;\n }\n }\n }\n if(this.state.commenting === false){\n if(max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size){\n return this.__error(\n new CsvError('CSV_MAX_RECORD_SIZE', [\n 'Max Record Size:',\n 'record exceed the maximum number of tolerated bytes',\n `of ${max_record_size}`,\n `at line ${this.info.lines}`,\n ], this.options, this.__infoField())\n );\n }\n }\n const lappend = ltrim === false || this.state.quoting === true || this.state.field.length !== 0 || !this.__isCharTrimable(buf, pos);\n // rtrim in non quoting is handle in __onField\n const rappend = rtrim === false || this.state.wasQuoting === false;\n if(lappend === true && rappend === true){\n this.state.field.append(chr);\n }else if(rtrim === true && !this.__isCharTrimable(buf, pos)){\n return this.__error(\n new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', [\n 'Invalid Closing Quote:',\n 'found non trimable byte after quote',\n `at line ${this.info.lines}`,\n ], this.options, this.__infoField())\n );\n }else{\n if(lappend === false){\n pos += this.__isCharTrimable(buf, pos) - 1;\n }\n continue;\n }\n }\n if(end === true){\n // Ensure we are not ending in a quoting state\n if(this.state.quoting === true){\n const err = this.__error(\n new CsvError('CSV_QUOTE_NOT_CLOSED', [\n 'Quote Not Closed:',\n `the parsing is finished with an opening quote at line ${this.info.lines}`,\n ], this.options, this.__infoField())\n );\n if(err !== undefined) return err;\n }else{\n // Skip last line if it has no characters\n if(this.state.wasQuoting === true || this.state.record.length !== 0 || this.state.field.length !== 0){\n this.info.bytes = this.state.bufBytesStart + pos;\n const errField = this.__onField();\n if(errField !== undefined) return errField;\n const errRecord = this.__onRecord(push);\n if(errRecord !== undefined) return errRecord;\n }else if(this.state.wasRowDelimiter === true){\n this.info.empty_lines++;\n }else if(this.state.commenting === true){\n this.info.comment_lines++;\n }\n }\n }else{\n this.state.bufBytesStart += pos;\n this.state.previousBuf = buf.slice(pos);\n }\n if(this.state.wasRowDelimiter === true){\n this.info.lines++;\n this.state.wasRowDelimiter = false;\n }\n },\n __onRecord: function(push){\n const {columns, group_columns_by_name, encoding, info, from, relax_column_count, relax_column_count_less, relax_column_count_more, raw, skip_records_with_empty_values} = this.options;\n const {enabled, record} = this.state;\n if(enabled === false){\n return this.__resetRecord();\n }\n // Convert the first line into column names\n const recordLength = record.length;\n if(columns === true){\n if(skip_records_with_empty_values === true && isRecordEmpty(record)){\n this.__resetRecord();\n return;\n }\n return this.__firstLineToColumns(record);\n }\n if(columns === false && this.info.records === 0){\n this.state.expectedRecordLength = recordLength;\n }\n if(recordLength !== this.state.expectedRecordLength){\n const err = columns === false ?\n new CsvError('CSV_RECORD_INCONSISTENT_FIELDS_LENGTH', [\n 'Invalid Record Length:',\n `expect ${this.state.expectedRecordLength},`,\n `got ${recordLength} on line ${this.info.lines}`,\n ], this.options, this.__infoField(), {\n record: record,\n })\n :\n new CsvError('CSV_RECORD_INCONSISTENT_COLUMNS', [\n 'Invalid Record Length:',\n `columns length is ${columns.length},`, // rename columns\n `got ${recordLength} on line ${this.info.lines}`,\n ], this.options, this.__infoField(), {\n record: record,\n });\n if(relax_column_count === true ||\n (relax_column_count_less === true && recordLength < this.state.expectedRecordLength) ||\n (relax_column_count_more === true && recordLength > this.state.expectedRecordLength)){\n this.info.invalid_field_length++;\n this.state.error = err;\n // Error is undefined with skip_records_with_error\n }else{\n const finalErr = this.__error(err);\n if(finalErr) return finalErr;\n }\n }\n if(skip_records_with_empty_values === true && isRecordEmpty(record)){\n this.__resetRecord();\n return;\n }\n if(this.state.recordHasError === true){\n this.__resetRecord();\n this.state.recordHasError = false;\n return;\n }\n this.info.records++;\n if(from === 1 || this.info.records >= from){\n const {objname} = this.options;\n // With columns, records are object\n if(columns !== false){\n const obj = {};\n // Transform record array to an object\n for(let i = 0, l = record.length; i < l; i++){\n if(columns[i] === undefined || columns[i].disabled) continue;\n // Turn duplicate columns into an array\n if (group_columns_by_name === true && obj[columns[i].name] !== undefined) {\n if (Array.isArray(obj[columns[i].name])) {\n obj[columns[i].name] = obj[columns[i].name].concat(record[i]);\n } else {\n obj[columns[i].name] = [obj[columns[i].name], record[i]];\n }\n } else {\n obj[columns[i].name] = record[i];\n }\n }\n // Without objname (default)\n if(raw === true || info === true){\n const extRecord = Object.assign(\n {record: obj},\n (raw === true ? {raw: this.state.rawBuffer.toString(encoding)}: {}),\n (info === true ? {info: this.__infoRecord()}: {})\n );\n const err = this.__push(\n objname === undefined ? extRecord : [obj[objname], extRecord]\n , push);\n if(err){\n return err;\n }\n }else{\n const err = this.__push(\n objname === undefined ? obj : [obj[objname], obj]\n , push);\n if(err){\n return err;\n }\n }\n // Without columns, records are array\n }else{\n if(raw === true || info === true){\n const extRecord = Object.assign(\n {record: record},\n raw === true ? {raw: this.state.rawBuffer.toString(encoding)}: {},\n info === true ? {info: this.__infoRecord()}: {}\n );\n const err = this.__push(\n objname === undefined ? extRecord : [record[objname], extRecord]\n , push);\n if(err){\n return err;\n }\n }else{\n const err = this.__push(\n objname === undefined ? record : [record[objname], record]\n , push);\n if(err){\n return err;\n }\n }\n }\n }\n this.__resetRecord();\n },\n __firstLineToColumns: function(record){\n const {firstLineToHeaders} = this.state;\n try{\n const headers = firstLineToHeaders === undefined ? record : firstLineToHeaders.call(null, record);\n if(!Array.isArray(headers)){\n return this.__error(\n new CsvError('CSV_INVALID_COLUMN_MAPPING', [\n 'Invalid Column Mapping:',\n 'expect an array from column function,',\n `got ${JSON.stringify(headers)}`\n ], this.options, this.__infoField(), {\n headers: headers,\n })\n );\n }\n const normalizedHeaders = normalize_columns_array(headers);\n this.state.expectedRecordLength = normalizedHeaders.length;\n this.options.columns = normalizedHeaders;\n this.__resetRecord();\n return;\n }catch(err){\n return err;\n }\n },\n __resetRecord: function(){\n if(this.options.raw === true){\n this.state.rawBuffer.reset();\n }\n this.state.error = undefined;\n this.state.record = [];\n this.state.record_length = 0;\n },\n __onField: function(){\n const {cast, encoding, rtrim, max_record_size} = this.options;\n const {enabled, wasQuoting} = this.state;\n // Short circuit for the from_line options\n if(enabled === false){\n return this.__resetField();\n }\n let field = this.state.field.toString(encoding);\n if(rtrim === true && wasQuoting === false){\n field = field.trimRight();\n }\n if(cast === true){\n const [err, f] = this.__cast(field);\n if(err !== undefined) return err;\n field = f;\n }\n this.state.record.push(field);\n // Increment record length if record size must not exceed a limit\n if(max_record_size !== 0 && typeof field === 'string'){\n this.state.record_length += field.length;\n }\n this.__resetField();\n },\n __resetField: function(){\n this.state.field.reset();\n this.state.wasQuoting = false;\n },\n __push: function(record, push){\n const {on_record} = this.options;\n if(on_record !== undefined){\n const info = this.__infoRecord();\n try{\n record = on_record.call(null, record, info);\n }catch(err){\n return err;\n }\n if(record === undefined || record === null){ return; }\n }\n push(record);\n },\n // Return a tuple with the error and the casted value\n __cast: function(field){\n const {columns, relax_column_count} = this.options;\n const isColumns = Array.isArray(columns);\n // Dont loose time calling cast\n // because the final record is an object\n // and this field can't be associated to a key present in columns\n if(isColumns === true && relax_column_count && this.options.columns.length <= this.state.record.length){\n return [undefined, undefined];\n }\n if(this.state.castField !== null){\n try{\n const info = this.__infoField();\n return [undefined, this.state.castField.call(null, field, info)];\n }catch(err){\n return [err];\n }\n }\n if(this.__isFloat(field)){\n return [undefined, parseFloat(field)];\n }else if(this.options.cast_date !== false){\n const info = this.__infoField();\n return [undefined, this.options.cast_date.call(null, field, info)];\n }\n return [undefined, field];\n },\n // Helper to test if a character is a space or a line delimiter\n __isCharTrimable: function(buf, pos){\n const isTrim = (buf, pos) => {\n const {timchars} = this.state;\n loop1: for(let i = 0; i < timchars.length; i++){\n const timchar = timchars[i];\n for(let j = 0; j < timchar.length; j++){\n if(timchar[j] !== buf[pos+j]) continue loop1;\n }\n return timchar.length;\n }\n return 0;\n };\n return isTrim(buf, pos);\n },\n // Keep it in case we implement the `cast_int` option\n // __isInt(value){\n // // return Number.isInteger(parseInt(value))\n // // return !isNaN( parseInt( obj ) );\n // return /^(\\-|\\+)?[1-9][0-9]*$/.test(value)\n // }\n __isFloat: function(value){\n return (value - parseFloat(value) + 1) >= 0; // Borrowed from jquery\n },\n __compareBytes: function(sourceBuf, targetBuf, targetPos, firstByte){\n if(sourceBuf[0] !== firstByte) return 0;\n const sourceLength = sourceBuf.length;\n for(let i = 1; i < sourceLength; i++){\n if(sourceBuf[i] !== targetBuf[targetPos+i]) return 0;\n }\n return sourceLength;\n },\n __isDelimiter: function(buf, pos, chr){\n const {delimiter, ignore_last_delimiters} = this.options;\n if(ignore_last_delimiters === true && this.state.record.length === this.options.columns.length - 1){\n return 0;\n }else if(ignore_last_delimiters !== false && typeof ignore_last_delimiters === 'number' && this.state.record.length === ignore_last_delimiters - 1){\n return 0;\n }\n loop1: for(let i = 0; i < delimiter.length; i++){\n const del = delimiter[i];\n if(del[0] === chr){\n for(let j = 1; j < del.length; j++){\n if(del[j] !== buf[pos+j]) continue loop1;\n }\n return del.length;\n }\n }\n return 0;\n },\n __isRecordDelimiter: function(chr, buf, pos){\n const {record_delimiter} = this.options;\n const recordDelimiterLength = record_delimiter.length;\n loop1: for(let i = 0; i < recordDelimiterLength; i++){\n const rd = record_delimiter[i];\n const rdLength = rd.length;\n if(rd[0] !== chr){\n continue;\n }\n for(let j = 1; j < rdLength; j++){\n if(rd[j] !== buf[pos+j]){\n continue loop1;\n }\n }\n return rd.length;\n }\n return 0;\n },\n __isEscape: function(buf, pos, chr){\n const {escape} = this.options;\n if(escape === null) return false;\n const l = escape.length;\n if(escape[0] === chr){\n for(let i = 0; i < l; i++){\n if(escape[i] !== buf[pos+i]){\n return false;\n }\n }\n return true;\n }\n return false;\n },\n __isQuote: function(buf, pos){\n const {quote} = this.options;\n if(quote === null) return false;\n const l = quote.length;\n for(let i = 0; i < l; i++){\n if(quote[i] !== buf[pos+i]){\n return false;\n }\n }\n return true;\n },\n __autoDiscoverRecordDelimiter: function(buf, pos){\n const { encoding } = this.options;\n // Note, we don't need to cache this information in state,\n // It is only called on the first line until we find out a suitable\n // record delimiter.\n const rds = [\n // Important, the windows line ending must be before mac os 9\n Buffer.from('\\r\\n', encoding),\n Buffer.from('\\n', encoding),\n Buffer.from('\\r', encoding),\n ];\n loop: for(let i = 0; i < rds.length; i++){\n const l = rds[i].length;\n for(let j = 0; j < l; j++){\n if(rds[i][j] !== buf[pos + j]){\n continue loop;\n }\n }\n this.options.record_delimiter.push(rds[i]);\n this.state.recordDelimiterMaxLength = rds[i].length;\n return rds[i].length;\n }\n return 0;\n },\n __error: function(msg){\n const {encoding, raw, skip_records_with_error} = this.options;\n const err = typeof msg === 'string' ? new Error(msg) : msg;\n if(skip_records_with_error){\n this.state.recordHasError = true;\n if(this.options.on_skip !== undefined){\n this.options.on_skip(err, raw ? this.state.rawBuffer.toString(encoding) : undefined);\n }\n // this.emit('skip', err, raw ? this.state.rawBuffer.toString(encoding) : undefined);\n return undefined;\n }else{\n return err;\n }\n },\n __infoDataSet: function(){\n return {\n ...this.info,\n columns: this.options.columns\n };\n },\n __infoRecord: function(){\n const {columns, raw, encoding} = this.options;\n return {\n ...this.__infoDataSet(),\n error: this.state.error,\n header: columns === true,\n index: this.state.record.length,\n raw: raw ? this.state.rawBuffer.toString(encoding) : undefined\n };\n },\n __infoField: function(){\n const {columns} = this.options;\n const isColumns = Array.isArray(columns);\n return {\n ...this.__infoRecord(),\n column: isColumns === true ?\n (columns.length > this.state.record.length ?\n columns[this.state.record.length].name :\n null\n ) :\n this.state.record.length,\n quoting: this.state.wasQuoting,\n };\n }\n };\n};\n\n\nexport {transform, CsvError};\n","\nimport {CsvError, transform} from './api/index.js';\n\nconst parse = function(data, opts={}){\n if(typeof data === 'string'){\n data = Buffer.from(data);\n }\n const records = opts && opts.objname ? {} : [];\n const parser = transform(opts);\n const push = (record) => {\n if(parser.options.objname === undefined)\n records.push(record);\n else{\n records[record[0]] = record[1];\n }\n };\n const close = () => {};\n const err1 = parser.parse(data, false, push, close);\n if(err1 !== undefined) throw err1;\n const err2 = parser.parse(undefined, true, push, close);\n if(err2 !== undefined) throw err2;\n return records;\n};\n\n// export default parse\nexport { parse };\nexport { CsvError };\n","/* eslint-disable */\nimport type { CallContext, CallOptions } from \"nice-grpc-common\";\nimport _m0 from \"protobufjs/minimal.js\";\nimport { Empty } from \"../../../google/protobuf/empty.js\";\nimport { Timestamp } from \"../../../google/protobuf/timestamp.js\";\n\nexport interface CoinID {\n symbol?: string | undefined;\n address?: CoinID_AddressIdentifier | undefined;\n}\n\nexport interface CoinID_AddressIdentifier {\n address: string;\n chain: string;\n}\n\nexport interface GetPriceRequest {\n timestamp: Date | undefined;\n coinId: CoinID | undefined;\n source: string;\n}\n\nexport interface GetPriceResponse {\n price: number;\n timestamp: Date | undefined;\n}\n\nexport interface BatchGetPricesRequest {\n timestamps: Date[];\n coinIds: CoinID[];\n}\n\nexport interface BatchGetPricesResponse {\n prices: BatchGetPricesResponse_CoinPrice[];\n}\n\nexport interface BatchGetPricesResponse_CoinPrice {\n coinId: CoinID | undefined;\n price?: BatchGetPricesResponse_CoinPrice_Price | undefined;\n error?: string | undefined;\n}\n\nexport interface BatchGetPricesResponse_CoinPrice_Price {\n results: GetPriceResponse[];\n}\n\nexport interface ListCoinsRequest {\n limit: number;\n offset: number;\n searchQuery: string;\n chain: string;\n}\n\nexport interface ListCoinsResponse {\n coins: CoinID[];\n coinAddressesInChain: { [key: string]: CoinID };\n}\n\nexport interface ListCoinsResponse_CoinAddressesInChainEntry {\n key: string;\n value: CoinID | undefined;\n}\n\nexport interface CheckLatestPriceResponse {\n prices: CheckLatestPriceResponse_CoinPrice[];\n latestPrice: CheckLatestPriceResponse_CoinPrice | undefined;\n}\n\nexport interface CheckLatestPriceResponse_CoinPrice {\n coinId: CoinID | undefined;\n price: number;\n timestamp: Date | undefined;\n}\n\nexport interface BackfillCoinRequest {\n name: string;\n symbol: string;\n chain: string;\n address: string;\n coingeckoId: string;\n decimals: number;\n logoUrl: string;\n projectUrl: string;\n accountAddress: string;\n moduleName: string;\n structName: string;\n}\n\nexport interface BackfillCoinResponse {\n symbol: string;\n message: string;\n}\n\nfunction createBaseCoinID(): CoinID {\n return { symbol: undefined, address: undefined };\n}\n\nexport const CoinID = {\n encode(message: CoinID, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.symbol !== undefined) {\n writer.uint32(18).string(message.symbol);\n }\n if (message.address !== undefined) {\n CoinID_AddressIdentifier.encode(message.address, writer.uint32(26).fork()).ldelim();\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): CoinID {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseCoinID();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.symbol = reader.string();\n continue;\n case 3:\n if (tag !== 26) {\n break;\n }\n\n message.address = CoinID_AddressIdentifier.decode(reader, reader.uint32());\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): CoinID {\n return {\n symbol: isSet(object.symbol) ? globalThis.String(object.symbol) : undefined,\n address: isSet(object.address) ? CoinID_AddressIdentifier.fromJSON(object.address) : undefined,\n };\n },\n\n toJSON(message: CoinID): unknown {\n const obj: any = {};\n if (message.symbol !== undefined) {\n obj.symbol = message.symbol;\n }\n if (message.address !== undefined) {\n obj.address = CoinID_AddressIdentifier.toJSON(message.address);\n }\n return obj;\n },\n\n create(base?: DeepPartial<CoinID>): CoinID {\n return CoinID.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<CoinID>): CoinID {\n const message = createBaseCoinID();\n message.symbol = object.symbol ?? undefined;\n message.address = (object.address !== undefined && object.address !== null)\n ? CoinID_AddressIdentifier.fromPartial(object.address)\n : undefined;\n return message;\n },\n};\n\nfunction createBaseCoinID_AddressIdentifier(): CoinID_AddressIdentifier {\n return { address: \"\", chain: \"\" };\n}\n\nexport const CoinID_AddressIdentifier = {\n encode(message: CoinID_AddressIdentifier, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.address !== \"\") {\n writer.uint32(10).string(message.address);\n }\n if (message.chain !== \"\") {\n writer.uint32(18).string(message.chain);\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): CoinID_AddressIdentifier {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseCoinID_AddressIdentifier();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.address = reader.string();\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.chain = reader.string();\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): CoinID_AddressIdentifier {\n return {\n address: isSet(object.address) ? globalThis.String(object.address) : \"\",\n chain: isSet(object.chain) ? globalThis.String(object.chain) : \"\",\n };\n },\n\n toJSON(message: CoinID_AddressIdentifier): unknown {\n const obj: any = {};\n if (message.address !== \"\") {\n obj.address = message.address;\n }\n if (message.chain !== \"\") {\n obj.chain = message.chain;\n }\n return obj;\n },\n\n create(base?: DeepPartial<CoinID_AddressIdentifier>): CoinID_AddressIdentifier {\n return CoinID_AddressIdentifier.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<CoinID_AddressIdentifier>): CoinID_AddressIdentifier {\n const message = createBaseCoinID_AddressIdentifier();\n message.address = object.address ?? \"\";\n message.chain = object.chain ?? \"\";\n return message;\n },\n};\n\nfunction createBaseGetPriceRequest(): GetPriceRequest {\n return { timestamp: undefined, coinId: undefined, source: \"\" };\n}\n\nexport const GetPriceRequest = {\n encode(message: GetPriceRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.timestamp !== undefined) {\n Timestamp.encode(toTimestamp(message.timestamp), writer.uint32(10).fork()).ldelim();\n }\n if (message.coinId !== undefined) {\n CoinID.encode(message.coinId, writer.uint32(18).fork()).ldelim();\n }\n if (message.source !== \"\") {\n writer.uint32(26).string(message.source);\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): GetPriceRequest {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseGetPriceRequest();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.timestamp = fromTimestamp(Timestamp.decode(reader, reader.uint32()));\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.coinId = CoinID.decode(reader, reader.uint32());\n continue;\n case 3:\n if (tag !== 26) {\n break;\n }\n\n message.source = reader.string();\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): GetPriceRequest {\n return {\n timestamp: isSet(object.timestamp) ? fromJsonTimestamp(object.timestamp) : undefined,\n coinId: isSet(object.coinId) ? CoinID.fromJSON(object.coinId) : undefined,\n source: isSet(object.source) ? globalThis.String(object.source) : \"\",\n };\n },\n\n toJSON(message: GetPriceRequest): unknown {\n const obj: any = {};\n if (message.timestamp !== undefined) {\n obj.timestamp = message.timestamp.toISOString();\n }\n if (message.coinId !== undefined) {\n obj.coinId = CoinID.toJSON(message.coinId);\n }\n if (message.source !== \"\") {\n obj.source = message.source;\n }\n return obj;\n },\n\n create(base?: DeepPartial<GetPriceRequest>): GetPriceRequest {\n return GetPriceRequest.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<GetPriceRequest>): GetPriceRequest {\n const message = createBaseGetPriceRequest();\n message.timestamp = object.timestamp ?? undefined;\n message.coinId = (object.coinId !== undefined && object.coinId !== null)\n ? CoinID.fromPartial(object.coinId)\n : undefined;\n message.source = object.source ?? \"\";\n return message;\n },\n};\n\nfunction createBaseGetPriceResponse(): GetPriceResponse {\n return { price: 0, timestamp: undefined };\n}\n\nexport const GetPriceResponse = {\n encode(message: GetPriceResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.price !== 0) {\n writer.uint32(9).double(message.price);\n }\n if (message.timestamp !== undefined) {\n Timestamp.encode(toTimestamp(message.timestamp), writer.uint32(18).fork()).ldelim();\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): GetPriceResponse {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseGetPriceResponse();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 9) {\n break;\n }\n\n message.price = reader.double();\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.timestamp = fromTimestamp(Timestamp.decode(reader, reader.uint32()));\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): GetPriceResponse {\n return {\n price: isSet(object.price) ? globalThis.Number(object.price) : 0,\n timestamp: isSet(object.timestamp) ? fromJsonTimestamp(object.timestamp) : undefined,\n };\n },\n\n toJSON(message: GetPriceResponse): unknown {\n const obj: any = {};\n if (message.price !== 0) {\n obj.price = message.price;\n }\n if (message.timestamp !== undefined) {\n obj.timestamp = message.timestamp.toISOString();\n }\n return obj;\n },\n\n create(base?: DeepPartial<GetPriceResponse>): GetPriceResponse {\n return GetPriceResponse.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<GetPriceResponse>): GetPriceResponse {\n const message = createBaseGetPriceResponse();\n message.price = object.price ?? 0;\n message.timestamp = object.timestamp ?? undefined;\n return message;\n },\n};\n\nfunction createBaseBatchGetPricesRequest(): BatchGetPricesRequest {\n return { timestamps: [], coinIds: [] };\n}\n\nexport const BatchGetPricesRequest = {\n encode(message: BatchGetPricesRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n for (const v of message.timestamps) {\n Timestamp.encode(toTimestamp(v!), writer.uint32(10).fork()).ldelim();\n }\n for (const v of message.coinIds) {\n CoinID.encode(v!, writer.uint32(18).fork()).ldelim();\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): BatchGetPricesRequest {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseBatchGetPricesRequest();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.timestamps.push(fromTimestamp(Timestamp.decode(reader, reader.uint32())));\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.coinIds.push(CoinID.decode(reader, reader.uint32()));\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): BatchGetPricesRequest {\n return {\n timestamps: globalThis.Array.isArray(object?.timestamps)\n ? object.timestamps.map((e: any) => fromJsonTimestamp(e))\n : [],\n coinIds: globalThis.Array.isArray(object?.coinIds) ? object.coinIds.map((e: any) => CoinID.fromJSON(e)) : [],\n };\n },\n\n toJSON(message: BatchGetPricesRequest): unknown {\n const obj: any = {};\n if (message.timestamps?.length) {\n obj.timestamps = message.timestamps.map((e) => e.toISOString());\n }\n if (message.coinIds?.length) {\n obj.coinIds = message.coinIds.map((e) => CoinID.toJSON(e));\n }\n return obj;\n },\n\n create(base?: DeepPartial<BatchGetPricesRequest>): BatchGetPricesRequest {\n return BatchGetPricesRequest.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<BatchGetPricesRequest>): BatchGetPricesRequest {\n const message = createBaseBatchGetPricesRequest();\n message.timestamps = object.timestamps?.map((e) => e) || [];\n message.coinIds = object.coinIds?.map((e) => CoinID.fromPartial(e)) || [];\n return message;\n },\n};\n\nfunction createBaseBatchGetPricesResponse(): BatchGetPricesResponse {\n return { prices: [] };\n}\n\nexport const BatchGetPricesResponse = {\n encode(message: BatchGetPricesResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n for (const v of message.prices) {\n BatchGetPricesResponse_CoinPrice.encode(v!, writer.uint32(10).fork()).ldelim();\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): BatchGetPricesResponse {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseBatchGetPricesResponse();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.prices.push(BatchGetPricesResponse_CoinPrice.decode(reader, reader.uint32()));\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): BatchGetPricesResponse {\n return {\n prices: globalThis.Array.isArray(object?.prices)\n ? object.prices.map((e: any) => BatchGetPricesResponse_CoinPrice.fromJSON(e))\n : [],\n };\n },\n\n toJSON(message: BatchGetPricesResponse): unknown {\n const obj: any = {};\n if (message.prices?.length) {\n obj.prices = message.prices.map((e) => BatchGetPricesResponse_CoinPrice.toJSON(e));\n }\n return obj;\n },\n\n create(base?: DeepPartial<BatchGetPricesResponse>): BatchGetPricesResponse {\n return BatchGetPricesResponse.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<BatchGetPricesResponse>): BatchGetPricesResponse {\n const message = createBaseBatchGetPricesResponse();\n message.prices = object.prices?.map((e) => BatchGetPricesResponse_CoinPrice.fromPartial(e)) || [];\n return message;\n },\n};\n\nfunction createBaseBatchGetPricesResponse_CoinPrice(): BatchGetPricesResponse_CoinPrice {\n return { coinId: undefined, price: undefined, error: undefined };\n}\n\nexport const BatchGetPricesResponse_CoinPrice = {\n encode(message: BatchGetPricesResponse_CoinPrice, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.coinId !== undefined) {\n CoinID.encode(message.coinId, writer.uint32(10).fork()).ldelim();\n }\n if (message.price !== undefined) {\n BatchGetPricesResponse_CoinPrice_Price.encode(message.price, writer.uint32(18).fork()).ldelim();\n }\n if (message.error !== undefined) {\n writer.uint32(26).string(message.error);\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): BatchGetPricesResponse_CoinPrice {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseBatchGetPricesResponse_CoinPrice();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.coinId = CoinID.decode(reader, reader.uint32());\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.price = BatchGetPricesResponse_CoinPrice_Price.decode(reader, reader.uint32());\n continue;\n case 3:\n if (tag !== 26) {\n break;\n }\n\n message.error = reader.string();\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): BatchGetPricesResponse_CoinPrice {\n return {\n coinId: isSet(object.coinId) ? CoinID.fromJSON(object.coinId) : undefined,\n price: isSet(object.price) ? BatchGetPricesResponse_CoinPrice_Price.fromJSON(object.price) : undefined,\n error: isSet(object.error) ? globalThis.String(object.error) : undefined,\n };\n },\n\n toJSON(message: BatchGetPricesResponse_CoinPrice): unknown {\n const obj: any = {};\n if (message.coinId !== undefined) {\n obj.coinId = CoinID.toJSON(message.coinId);\n }\n if (message.price !== undefined) {\n obj.price = BatchGetPricesResponse_CoinPrice_Price.toJSON(message.price);\n }\n if (message.error !== undefined) {\n obj.error = message.error;\n }\n return obj;\n },\n\n create(base?: DeepPartial<BatchGetPricesResponse_CoinPrice>): BatchGetPricesResponse_CoinPrice {\n return BatchGetPricesResponse_CoinPrice.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<BatchGetPricesResponse_CoinPrice>): BatchGetPricesResponse_CoinPrice {\n const message = createBaseBatchGetPricesResponse_CoinPrice();\n message.coinId = (object.coinId !== undefined && object.coinId !== null)\n ? CoinID.fromPartial(object.coinId)\n : undefined;\n message.price = (object.price !== undefined && object.price !== null)\n ? BatchGetPricesResponse_CoinPrice_Price.fromPartial(object.price)\n : undefined;\n message.error = object.error ?? undefined;\n return message;\n },\n};\n\nfunction createBaseBatchGetPricesResponse_CoinPrice_Price(): BatchGetPricesResponse_CoinPrice_Price {\n return { results: [] };\n}\n\nexport const BatchGetPricesResponse_CoinPrice_Price = {\n encode(message: BatchGetPricesResponse_CoinPrice_Price, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n for (const v of message.results) {\n GetPriceResponse.encode(v!, writer.uint32(10).fork()).ldelim();\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): BatchGetPricesResponse_CoinPrice_Price {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseBatchGetPricesResponse_CoinPrice_Price();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.results.push(GetPriceResponse.decode(reader, reader.uint32()));\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): BatchGetPricesResponse_CoinPrice_Price {\n return {\n results: globalThis.Array.isArray(object?.results)\n ? object.results.map((e: any) => GetPriceResponse.fromJSON(e))\n : [],\n };\n },\n\n toJSON(message: BatchGetPricesResponse_CoinPrice_Price): unknown {\n const obj: any = {};\n if (message.results?.length) {\n obj.results = message.results.map((e) => GetPriceResponse.toJSON(e));\n }\n return obj;\n },\n\n create(base?: DeepPartial<BatchGetPricesResponse_CoinPrice_Price>): BatchGetPricesResponse_CoinPrice_Price {\n return BatchGetPricesResponse_CoinPrice_Price.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<BatchGetPricesResponse_CoinPrice_Price>): BatchGetPricesResponse_CoinPrice_Price {\n const message = createBaseBatchGetPricesResponse_CoinPrice_Price();\n message.results = object.results?.map((e) => GetPriceResponse.fromPartial(e)) || [];\n return message;\n },\n};\n\nfunction createBaseListCoinsRequest(): ListCoinsRequest {\n return { limit: 0, offset: 0, searchQuery: \"\", chain: \"\" };\n}\n\nexport const ListCoinsRequest = {\n encode(message: ListCoinsRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.limit !== 0) {\n writer.uint32(8).int32(message.limit);\n }\n if (message.offset !== 0) {\n writer.uint32(16).int32(message.offset);\n }\n if (message.searchQuery !== \"\") {\n writer.uint32(26).string(message.searchQuery);\n }\n if (message.chain !== \"\") {\n writer.uint32(34).string(message.chain);\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): ListCoinsRequest {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseListCoinsRequest();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 8) {\n break;\n }\n\n message.limit = reader.int32();\n continue;\n case 2:\n if (tag !== 16) {\n break;\n }\n\n message.offset = reader.int32();\n continue;\n case 3:\n if (tag !== 26) {\n break;\n }\n\n message.searchQuery = reader.string();\n continue;\n case 4:\n if (tag !== 34) {\n break;\n }\n\n message.chain = reader.string();\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): ListCoinsRequest {\n return {\n limit: isSet(object.limit) ? globalThis.Number(object.limit) : 0,\n offset: isSet(object.offset) ? globalThis.Number(object.offset) : 0,\n searchQuery: isSet(object.searchQuery) ? globalThis.String(object.searchQuery) : \"\",\n chain: isSet(object.chain) ? globalThis.String(object.chain) : \"\",\n };\n },\n\n toJSON(message: ListCoinsRequest): unknown {\n const obj: any = {};\n if (message.limit !== 0) {\n obj.limit = Math.round(message.limit);\n }\n if (message.offset !== 0) {\n obj.offset = Math.round(message.offset);\n }\n if (message.searchQuery !== \"\") {\n obj.searchQuery = message.searchQuery;\n }\n if (message.chain !== \"\") {\n obj.chain = message.chain;\n }\n return obj;\n },\n\n create(base?: DeepPartial<ListCoinsRequest>): ListCoinsRequest {\n return ListCoinsRequest.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<ListCoinsRequest>): ListCoinsRequest {\n const message = createBaseListCoinsRequest();\n message.limit = object.limit ?? 0;\n message.offset = object.offset ?? 0;\n message.searchQuery = object.searchQuery ?? \"\";\n message.chain = object.chain ?? \"\";\n return message;\n },\n};\n\nfunction createBaseListCoinsResponse(): ListCoinsResponse {\n return { coins: [], coinAddressesInChain: {} };\n}\n\nexport const ListCoinsResponse = {\n encode(message: ListCoinsResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n for (const v of message.coins) {\n CoinID.encode(v!, writer.uint32(10).fork()).ldelim();\n }\n Object.entries(message.coinAddressesInChain).forEach(([key, value]) => {\n ListCoinsResponse_CoinAddressesInChainEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).ldelim();\n });\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): ListCoinsResponse {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseListCoinsResponse();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.coins.push(CoinID.decode(reader, reader.uint32()));\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n const entry2 = ListCoinsResponse_CoinAddressesInChainEntry.decode(reader, reader.uint32());\n if (entry2.value !== undefined) {\n message.coinAddressesInChain[entry2.key] = entry2.value;\n }\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): ListCoinsResponse {\n return {\n coins: globalThis.Array.isArray(object?.coins) ? object.coins.map((e: any) => CoinID.fromJSON(e)) : [],\n coinAddressesInChain: isObject(object.coinAddressesInChain)\n ? Object.entries(object.coinAddressesInChain).reduce<{ [key: string]: CoinID }>((acc, [key, value]) => {\n acc[key] = CoinID.fromJSON(value);\n return acc;\n }, {})\n : {},\n };\n },\n\n toJSON(message: ListCoinsResponse): unknown {\n const obj: any = {};\n if (message.coins?.length) {\n obj.coins = message.coins.map((e) => CoinID.toJSON(e));\n }\n if (message.coinAddressesInChain) {\n const entries = Object.entries(message.coinAddressesInChain);\n if (entries.length > 0) {\n obj.coinAddressesInChain = {};\n entries.forEach(([k, v]) => {\n obj.coinAddressesInChain[k] = CoinID.toJSON(v);\n });\n }\n }\n return obj;\n },\n\n create(base?: DeepPartial<ListCoinsResponse>): ListCoinsResponse {\n return ListCoinsResponse.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<ListCoinsResponse>): ListCoinsResponse {\n const message = createBaseListCoinsResponse();\n message.coins = object.coins?.map((e) => CoinID.fromPartial(e)) || [];\n message.coinAddressesInChain = Object.entries(object.coinAddressesInChain ?? {}).reduce<{ [key: string]: CoinID }>(\n (acc, [key, value]) => {\n if (value !== undefined) {\n acc[key] = CoinID.fromPartial(value);\n }\n return acc;\n },\n {},\n );\n return message;\n },\n};\n\nfunction createBaseListCoinsResponse_CoinAddressesInChainEntry(): ListCoinsResponse_CoinAddressesInChainEntry {\n return { key: \"\", value: undefined };\n}\n\nexport const ListCoinsResponse_CoinAddressesInChainEntry = {\n encode(message: ListCoinsResponse_CoinAddressesInChainEntry, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.key !== \"\") {\n writer.uint32(10).string(message.key);\n }\n if (message.value !== undefined) {\n CoinID.encode(message.value, writer.uint32(18).fork()).ldelim();\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): ListCoinsResponse_CoinAddressesInChainEntry {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseListCoinsResponse_CoinAddressesInChainEntry();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.key = reader.string();\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.value = CoinID.decode(reader, reader.uint32());\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): ListCoinsResponse_CoinAddressesInChainEntry {\n return {\n key: isSet(object.key) ? globalThis.String(object.key) : \"\",\n value: isSet(object.value) ? CoinID.fromJSON(object.value) : undefined,\n };\n },\n\n toJSON(message: ListCoinsResponse_CoinAddressesInChainEntry): unknown {\n const obj: any = {};\n if (message.key !== \"\") {\n obj.key = message.key;\n }\n if (message.value !== undefined) {\n obj.value = CoinID.toJSON(message.value);\n }\n return obj;\n },\n\n create(base?: DeepPartial<ListCoinsResponse_CoinAddressesInChainEntry>): ListCoinsResponse_CoinAddressesInChainEntry {\n return ListCoinsResponse_CoinAddressesInChainEntry.fromPartial(base ?? {});\n },\n fromPartial(\n object: DeepPartial<ListCoinsResponse_CoinAddressesInChainEntry>,\n ): ListCoinsResponse_CoinAddressesInChainEntry {\n const message = createBaseListCoinsResponse_CoinAddressesInChainEntry();\n message.key = object.key ?? \"\";\n message.value = (object.value !== undefined && object.value !== null)\n ? CoinID.fromPartial(object.value)\n : undefined;\n return message;\n },\n};\n\nfunction createBaseCheckLatestPriceResponse(): CheckLatestPriceResponse {\n return { prices: [], latestPrice: undefined };\n}\n\nexport const CheckLatestPriceResponse = {\n encode(message: CheckLatestPriceResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n for (const v of message.prices) {\n CheckLatestPriceResponse_CoinPrice.encode(v!, writer.uint32(10).fork()).ldelim();\n }\n if (message.latestPrice !== undefined) {\n CheckLatestPriceResponse_CoinPrice.encode(message.latestPrice, writer.uint32(18).fork()).ldelim();\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): CheckLatestPriceResponse {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseCheckLatestPriceResponse();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.prices.push(CheckLatestPriceResponse_CoinPrice.decode(reader, reader.uint32()));\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.latestPrice = CheckLatestPriceResponse_CoinPrice.decode(reader, reader.uint32());\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): CheckLatestPriceResponse {\n return {\n prices: globalThis.Array.isArray(object?.prices)\n ? object.prices.map((e: any) => CheckLatestPriceResponse_CoinPrice.fromJSON(e))\n : [],\n latestPrice: isSet(object.latestPrice)\n ? CheckLatestPriceResponse_CoinPrice.fromJSON(object.latestPrice)\n : undefined,\n };\n },\n\n toJSON(message: CheckLatestPriceResponse): unknown {\n const obj: any = {};\n if (message.prices?.length) {\n obj.prices = message.prices.map((e) => CheckLatestPriceResponse_CoinPrice.toJSON(e));\n }\n if (message.latestPrice !== undefined) {\n obj.latestPrice = CheckLatestPriceResponse_CoinPrice.toJSON(message.latestPrice);\n }\n return obj;\n },\n\n create(base?: DeepPartial<CheckLatestPriceResponse>): CheckLatestPriceResponse {\n return CheckLatestPriceResponse.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<CheckLatestPriceResponse>): CheckLatestPriceResponse {\n const message = createBaseCheckLatestPriceResponse();\n message.prices = object.prices?.map((e) => CheckLatestPriceResponse_CoinPrice.fromPartial(e)) || [];\n message.latestPrice = (object.latestPrice !== undefined && object.latestPrice !== null)\n ? CheckLatestPriceResponse_CoinPrice.fromPartial(object.latestPrice)\n : undefined;\n return message;\n },\n};\n\nfunction createBaseCheckLatestPriceResponse_CoinPrice(): CheckLatestPriceResponse_CoinPrice {\n return { coinId: undefined, price: 0, timestamp: undefined };\n}\n\nexport const CheckLatestPriceResponse_CoinPrice = {\n encode(message: CheckLatestPriceResponse_CoinPrice, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.coinId !== undefined) {\n CoinID.encode(message.coinId, writer.uint32(10).fork()).ldelim();\n }\n if (message.price !== 0) {\n writer.uint32(17).double(message.price);\n }\n if (message.timestamp !== undefined) {\n Timestamp.encode(toTimestamp(message.timestamp), writer.uint32(26).fork()).ldelim();\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): CheckLatestPriceResponse_CoinPrice {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseCheckLatestPriceResponse_CoinPrice();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.coinId = CoinID.decode(reader, reader.uint32());\n continue;\n case 2:\n if (tag !== 17) {\n break;\n }\n\n message.price = reader.double();\n continue;\n case 3:\n if (tag !== 26) {\n break;\n }\n\n message.timestamp = fromTimestamp(Timestamp.decode(reader, reader.uint32()));\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): CheckLatestPriceResponse_CoinPrice {\n return {\n coinId: isSet(object.coinId) ? CoinID.fromJSON(object.coinId) : undefined,\n price: isSet(object.price) ? globalThis.Number(object.price) : 0,\n timestamp: isSet(object.timestamp) ? fromJsonTimestamp(object.timestamp) : undefined,\n };\n },\n\n toJSON(message: CheckLatestPriceResponse_CoinPrice): unknown {\n const obj: any = {};\n if (message.coinId !== undefined) {\n obj.coinId = CoinID.toJSON(message.coinId);\n }\n if (message.price !== 0) {\n obj.price = message.price;\n }\n if (message.timestamp !== undefined) {\n obj.timestamp = message.timestamp.toISOString();\n }\n return obj;\n },\n\n create(base?: DeepPartial<CheckLatestPriceResponse_CoinPrice>): CheckLatestPriceResponse_CoinPrice {\n return CheckLatestPriceResponse_CoinPrice.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<CheckLatestPriceResponse_CoinPrice>): CheckLatestPriceResponse_CoinPrice {\n const message = createBaseCheckLatestPriceResponse_CoinPrice();\n message.coinId = (object.coinId !== undefined && object.coinId !== null)\n ? CoinID.fromPartial(object.coinId)\n : undefined;\n message.price = object.price ?? 0;\n message.timestamp = object.timestamp ?? undefined;\n return message;\n },\n};\n\nfunction createBaseBackfillCoinRequest(): BackfillCoinRequest {\n return {\n name: \"\",\n symbol: \"\",\n chain: \"\",\n address: \"\",\n coingeckoId: \"\",\n decimals: 0,\n logoUrl: \"\",\n projectUrl: \"\",\n accountAddress: \"\",\n moduleName: \"\",\n structName: \"\",\n };\n}\n\nexport const BackfillCoinRequest = {\n encode(message: BackfillCoinRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.name !== \"\") {\n writer.uint32(10).string(message.name);\n }\n if (message.symbol !== \"\") {\n writer.uint32(18).string(message.symbol);\n }\n if (message.chain !== \"\") {\n writer.uint32(26).string(message.chain);\n }\n if (message.address !== \"\") {\n writer.uint32(34).string(message.address);\n }\n if (message.coingeckoId !== \"\") {\n writer.uint32(42).string(message.coingeckoId);\n }\n if (message.decimals !== 0) {\n writer.uint32(48).uint32(message.decimals);\n }\n if (message.logoUrl !== \"\") {\n writer.uint32(58).string(message.logoUrl);\n }\n if (message.projectUrl !== \"\") {\n writer.uint32(66).string(message.projectUrl);\n }\n if (message.accountAddress !== \"\") {\n writer.uint32(74).string(message.accountAddress);\n }\n if (message.moduleName !== \"\") {\n writer.uint32(82).string(message.moduleName);\n }\n if (message.structName !== \"\") {\n writer.uint32(90).string(message.structName);\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): BackfillCoinRequest {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseBackfillCoinRequest();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.name = reader.string();\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.symbol = reader.string();\n continue;\n case 3:\n if (tag !== 26) {\n break;\n }\n\n message.chain = reader.string();\n continue;\n case 4:\n if (tag !== 34) {\n break;\n }\n\n message.address = reader.string();\n continue;\n case 5:\n if (tag !== 42) {\n break;\n }\n\n message.coingeckoId = reader.string();\n continue;\n case 6:\n if (tag !== 48) {\n break;\n }\n\n message.decimals = reader.uint32();\n continue;\n case 7:\n if (tag !== 58) {\n break;\n }\n\n message.logoUrl = reader.string();\n continue;\n case 8:\n if (tag !== 66) {\n break;\n }\n\n message.projectUrl = reader.string();\n continue;\n case 9:\n if (tag !== 74) {\n break;\n }\n\n message.accountAddress = reader.string();\n continue;\n case 10:\n if (tag !== 82) {\n break;\n }\n\n message.moduleName = reader.string();\n continue;\n case 11:\n if (tag !== 90) {\n break;\n }\n\n message.structName = reader.string();\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): BackfillCoinRequest {\n return {\n name: isSet(object.name) ? globalThis.String(object.name) : \"\",\n symbol: isSet(object.symbol) ? globalThis.String(object.symbol) : \"\",\n chain: isSet(object.chain) ? globalThis.String(object.chain) : \"\",\n address: isSet(object.address) ? globalThis.String(object.address) : \"\",\n coingeckoId: isSet(object.coingeckoId) ? globalThis.String(object.coingeckoId) : \"\",\n decimals: isSet(object.decimals) ? globalThis.Number(object.decimals) : 0,\n logoUrl: isSet(object.logoUrl) ? globalThis.String(object.logoUrl) : \"\",\n projectUrl: isSet(object.projectUrl) ? globalThis.String(object.projectUrl) : \"\",\n accountAddress: isSet(object.accountAddress) ? globalThis.String(object.accountAddress) : \"\",\n moduleName: isSet(object.moduleName) ? globalThis.String(object.moduleName) : \"\",\n structName: isSet(object.structName) ? globalThis.String(object.structName) : \"\",\n };\n },\n\n toJSON(message: BackfillCoinRequest): unknown {\n const obj: any = {};\n if (message.name !== \"\") {\n obj.name = message.name;\n }\n if (message.symbol !== \"\") {\n obj.symbol = message.symbol;\n }\n if (message.chain !== \"\") {\n obj.chain = message.chain;\n }\n if (message.address !== \"\") {\n obj.address = message.address;\n }\n if (message.coingeckoId !== \"\") {\n obj.coingeckoId = message.coingeckoId;\n }\n if (message.decimals !== 0) {\n obj.decimals = Math.round(message.decimals);\n }\n if (message.logoUrl !== \"\") {\n obj.logoUrl = message.logoUrl;\n }\n if (message.projectUrl !== \"\") {\n obj.projectUrl = message.projectUrl;\n }\n if (message.accountAddress !== \"\") {\n obj.accountAddress = message.accountAddress;\n }\n if (message.moduleName !== \"\") {\n obj.moduleName = message.moduleName;\n }\n if (message.structName !== \"\") {\n obj.structName = message.structName;\n }\n return obj;\n },\n\n create(base?: DeepPartial<BackfillCoinRequest>): BackfillCoinRequest {\n return BackfillCoinRequest.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<BackfillCoinRequest>): BackfillCoinRequest {\n const message = createBaseBackfillCoinRequest();\n message.name = object.name ?? \"\";\n message.symbol = object.symbol ?? \"\";\n message.chain = object.chain ?? \"\";\n message.address = object.address ?? \"\";\n message.coingeckoId = object.coingeckoId ?? \"\";\n message.decimals = object.decimals ?? 0;\n message.logoUrl = object.logoUrl ?? \"\";\n message.projectUrl = object.projectUrl ?? \"\";\n message.accountAddress = object.accountAddress ?? \"\";\n message.moduleName = object.moduleName ?? \"\";\n message.structName = object.structName ?? \"\";\n return message;\n },\n};\n\nfunction createBaseBackfillCoinResponse(): BackfillCoinResponse {\n return { symbol: \"\", message: \"\" };\n}\n\nexport const BackfillCoinResponse = {\n encode(message: BackfillCoinResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {\n if (message.symbol !== \"\") {\n writer.uint32(10).string(message.symbol);\n }\n if (message.message !== \"\") {\n writer.uint32(18).string(message.message);\n }\n return writer;\n },\n\n decode(input: _m0.Reader | Uint8Array, length?: number): BackfillCoinResponse {\n const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);\n let end = length === undefined ? reader.len : reader.pos + length;\n const message = createBaseBackfillCoinResponse();\n while (reader.pos < end) {\n const tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (tag !== 10) {\n break;\n }\n\n message.symbol = reader.string();\n continue;\n case 2:\n if (tag !== 18) {\n break;\n }\n\n message.message = reader.string();\n continue;\n }\n if ((tag & 7) === 4 || tag === 0) {\n break;\n }\n reader.skipType(tag & 7);\n }\n return message;\n },\n\n fromJSON(object: any): BackfillCoinResponse {\n return {\n symbol: isSet(object.symbol) ? globalThis.String(object.symbol) : \"\",\n message: isSet(object.message) ? globalThis.String(object.message) : \"\",\n };\n },\n\n toJSON(message: BackfillCoinResponse): unknown {\n const obj: any = {};\n if (message.symbol !== \"\") {\n obj.symbol = message.symbol;\n }\n if (message.message !== \"\") {\n obj.message = message.message;\n }\n return obj;\n },\n\n create(base?: DeepPartial<BackfillCoinResponse>): BackfillCoinResponse {\n return BackfillCoinResponse.fromPartial(base ?? {});\n },\n fromPartial(object: DeepPartial<BackfillCoinResponse>): BackfillCoinResponse {\n const message = createBaseBackfillCoinResponse();\n message.symbol = object.symbol ?? \"\";\n message.message = object.message ?? \"\";\n return message;\n },\n};\n\nexport type PriceServiceDefinition = typeof PriceServiceDefinition;\nexport const PriceServiceDefinition = {\n name: \"PriceService\",\n fullName: \"price_service.PriceService\",\n methods: {\n getPrice: {\n name: \"GetPrice\",\n requestType: GetPriceRequest,\n requestStream: false,\n responseType: GetPriceResponse,\n responseStream: false,\n options: {\n _unknownFields: {\n 578365826: [new Uint8Array([16, 18, 14, 47, 97, 112, 105, 47, 118, 49, 47, 112, 114, 105, 99, 101, 115])],\n },\n },\n },\n batchGetPrices: {\n name: \"BatchGetPrices\",\n requestType: BatchGetPricesRequest,\n requestStream: false,\n responseType: BatchGetPricesResponse,\n responseStream: false,\n options: {\n _unknownFields: {\n 578365826: [\n new Uint8Array([\n 22,\n 18,\n 20,\n 47,\n 97,\n 112,\n 105,\n 47,\n 118,\n 49,\n 47,\n 112,\n 114,\n 105,\n 99,\n 101,\n 115,\n 47,\n 98,\n 97,\n 116,\n 99,\n 104,\n ]),\n ],\n },\n },\n },\n listCoins: {\n name: \"ListCoins\",\n requestType: ListCoinsRequest,\n requestStream: false,\n responseType: ListCoinsResponse,\n responseStream: false,\n options: {\n _unknownFields: {\n 578365826: [\n new Uint8Array([\n 22,\n 18,\n 20,\n 47,\n 97,\n 112,\n 105,\n 47,\n 118,\n 49,\n 47,\n 112,\n 114,\n 105,\n 99,\n 101,\n 115,\n 47,\n 99,\n 111,\n 105,\n 110,\n 115,\n ]),\n ],\n },\n },\n },\n checkLatestPrice: {\n name: \"CheckLatestPrice\",\n requestType: Empty,\n requestStream: false,\n responseType: CheckLatestPriceResponse,\n responseStream: false,\n options: {\n _unknownFields: {\n 578365826: [\n new Uint8Array([\n 29,\n 18,\n 27,\n 47,\n 97,\n 112,\n 105,\n 47,\n 118,\n 49,\n 47,\n 112,\n 114,\n 105,\n 99,\n 101,\n 115,\n 47,\n 99,\n 104,\n 101,\n 99,\n 107,\n 95,\n 108,\n 97,\n 116,\n 101,\n 115,\n 116,\n ]),\n ],\n },\n },\n },\n backfillCoin: {\n name: \"BackfillCoin\",\n requestType: BackfillCoinRequest,\n requestStream: false,\n responseType: BackfillCoinResponse,\n responseStream: false,\n options: {\n _unknownFields: {\n 578365826: [\n new Uint8Array([\n 28,\n 34,\n 23,\n 47,\n 97,\n 112,\n 105,\n 47,\n 118,\n 49,\n 47,\n 112,\n 114,\n 105,\n 99,\n 101,\n 115,\n 47,\n 98,\n 97,\n 99,\n 107,\n 102,\n 105,\n 108,\n 108,\n 58,\n 1,\n 42,\n ]),\n ],\n },\n },\n },\n },\n} as const;\n\nexport interface PriceServiceImplementation<CallContextExt = {}> {\n getPrice(request: GetPriceRequest, context: CallContext & CallContextExt): Promise<DeepPartial<GetPriceResponse>>;\n batchGetPrices(\n request: BatchGetPricesRequest,\n context: CallContext & CallContextExt,\n ): Promise<DeepPartial<BatchGetPricesResponse>>;\n listCoins(request: ListCoinsRequest, context: CallContext & CallContextExt): Promise<DeepPartial<ListCoinsResponse>>;\n checkLatestPrice(\n request: Empty,\n context: CallContext & CallContextExt,\n ): Promise<DeepPartial<CheckLatestPriceResponse>>;\n backfillCoin(\n request: BackfillCoinRequest,\n context: CallContext & CallContextExt,\n ): Promise<DeepPartial<BackfillCoinResponse>>;\n}\n\nexport interface PriceServiceClient<CallOptionsExt = {}> {\n getPrice(request: DeepPartial<GetPriceRequest>, options?: CallOptions & CallOptionsExt): Promise<GetPriceResponse>;\n batchGetPrices(\n request: DeepPartial<BatchGetPricesRequest>,\n options?: CallOptions & CallOptionsExt,\n ): Promise<BatchGetPricesResponse>;\n listCoins(request: DeepPartial<ListCoinsRequest>, options?: CallOptions & CallOptionsExt): Promise<ListCoinsResponse>;\n checkLatestPrice(\n request: DeepPartial<Empty>,\n options?: CallOptions & CallOptionsExt,\n ): Promise<CheckLatestPriceResponse>;\n backfillCoin(\n request: DeepPartial<BackfillCoinRequest>,\n options?: CallOptions & CallOptionsExt,\n ): Promise<BackfillCoinResponse>;\n}\n\ntype Builtin = Date | Function | Uint8Array | string | number | boolean | bigint | undefined;\n\ntype DeepPartial<T> = T extends Builtin ? T\n : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>>\n : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>>\n : T extends {} ? { [K in keyof T]?: DeepPartial<T[K]> }\n : Partial<T>;\n\nfunction toTimestamp(date: Date): Timestamp {\n const seconds = BigInt(Math.trunc(date.getTime() / 1_000));\n const nanos = (date.getTime() % 1_000) * 1_000_000;\n return { seconds, nanos };\n}\n\nfunction fromTimestamp(t: Timestamp): Date {\n let millis = (globalThis.Number(t.seconds.toString()) || 0) * 1_000;\n millis += (t.nanos || 0) / 1_000_000;\n return new globalThis.Date(millis);\n}\n\nfunction fromJsonTimestamp(o: any): Date {\n if (o instanceof globalThis.Date) {\n return o;\n } else if (typeof o === \"string\") {\n return new globalThis.Date(o);\n } else {\n return fromTimestamp(Timestamp.fromJSON(o));\n }\n}\n\nfunction isObject(value: any): boolean {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isSet(value: any): boolean {\n return value !== null && value !== undefined;\n}\n","import { PriceServiceClient, PriceServiceDefinition } from '@sentio/protos/price'\nimport { CoinID } from '@sentio/protos'\nimport { createChannel, createClientFactory, Status } from 'nice-grpc'\nimport { prometheusClientMiddleware } from 'nice-grpc-prometheus'\nimport { retryMiddleware, RetryOptions } from 'nice-grpc-client-middleware-retry'\nimport { Endpoints } from '@sentio/runtime'\nimport { ChainId } from '@sentio/chain'\nimport { LRUCache } from 'lru-cache'\n\nexport function getPriceClient(address?: string) {\n if (!address) {\n address = Endpoints.INSTANCE.priceFeedAPI\n }\n const channel = createChannel(address)\n\n return createClientFactory()\n .use(prometheusClientMiddleware())\n .use(retryMiddleware)\n .create(PriceServiceDefinition, channel)\n}\n\nconst priceMap = new LRUCache<string, Promise<number | undefined>>({\n max: 100000,\n ttl: 1000 * 60 * 60 // 1 hour\n})\n\nlet priceClient: PriceServiceClient<RetryOptions>\n\ninterface PriceOptions {\n toleranceInDays?: number\n}\nasync function getPriceByTypeOrSymbol(date: Date, coinId: CoinID, options?: PriceOptions): Promise<number | undefined> {\n if (!priceClient) {\n priceClient = getPriceClient()\n }\n return getPriceByTypeOrSymbolInternal(priceClient, date, coinId, options)\n}\n\nexport async function getPriceByTypeOrSymbolInternal(\n priceClient: PriceServiceClient<RetryOptions>,\n date: Date,\n coinId: CoinID,\n options?: PriceOptions\n): Promise<number | undefined> {\n const dateStr = dateString(date)\n const todayDateString = dateString(new Date())\n\n let key: string\n if (coinId.symbol) {\n key = `${coinId.symbol}-${dateStr}`\n } else {\n key = `${coinId.address?.address}-${coinId.address?.chain}-${dateStr}`\n }\n let price = priceMap.get(key)\n if (price) {\n return price\n }\n\n const response = priceClient.getPrice(\n {\n timestamp: date,\n coinId\n },\n {\n retry: true,\n retryMaxAttempts: 5\n }\n )\n price = response\n .then((res) => {\n if (res.timestamp) {\n const responseDateString = dateString(res.timestamp)\n if (responseDateString === todayDateString) {\n priceMap.delete(key)\n } else {\n // https://www.javatpoint.com/javascript-date-difference\n const diff = Math.abs(res.timestamp.getTime() - date.getTime())\n const daysDiff = diff / (1000 * 60 * 60 * 24)\n const tolerance = options?.toleranceInDays || 2\n if (daysDiff > tolerance) {\n priceMap.delete(key)\n return undefined\n }\n }\n } else {\n priceMap.delete(key)\n }\n return res.price\n })\n .catch((e) => {\n setTimeout(() => {\n priceMap.delete(key)\n }, 1000)\n\n if (e.code === Status.NOT_FOUND || e.code === Status.UNKNOWN) {\n console.error('price not found for ', JSON.stringify(coinId), ' at ', dateStr)\n return undefined\n }\n // TODO maybe use small set of error\n priceMap.delete(key)\n throw e\n })\n priceMap.set(key, price)\n return price\n}\n\n/**\n *\n * @param chainId chain id refers to CHAIN_MAP\n * @param coinType\n * @param date\n * @param options other behavior options\n */\nexport async function getPriceByType(\n chainId: ChainId,\n coinType: string,\n date: Date,\n options?: PriceOptions\n): Promise<number | undefined> {\n return getPriceByTypeOrSymbol(\n date,\n {\n address: {\n chain: chainId,\n address: coinType\n }\n },\n options\n )\n}\n\n/**\n * @param symbol token symbol like BTC, etc\n * @param date\n * @param options other behavior options\n */\nexport async function getPriceBySymbol(\n symbol: string,\n date: Date,\n options?: PriceOptions\n): Promise<number | undefined> {\n return getPriceByTypeOrSymbol(date, { symbol }, options)\n}\n\nfunction dateString(date: Date) {\n return [date.getUTCDate(), date.getUTCMonth() + 1, date.getUTCFullYear()].join('-')\n}\n\n/**\n * get coins that has price, return results are list of coin id with both symbol and address field set\n * @param chainId\n */\nexport async function getCoinsThatHasPrice(chainId: ChainId) {\n if (!priceClient) {\n priceClient = getPriceClient()\n }\n const response = await priceClient.listCoins({\n chain: chainId,\n limit: 1000\n })\n\n return Object.entries(response.coinAddressesInChain).map(([symbol, coin]) => {\n coin.symbol = symbol\n return coin\n })\n}\n;process.stdout.write(\"\");","import { SimpleEthersError } from '../eth/index.js'\n\n/**\n * ignore eth call exception and return undefined if that happened\n * @param promise promise return by eth call\n * @param logError whether to log error\n */\nexport async function ignoreEthCallException<Res>(promise: Promise<Res>, logError = false): Promise<Res | undefined> {\n try {\n return await promise\n } catch (err) {\n if (err instanceof SimpleEthersError || err.code === 'CALL_EXCEPTION' || err.code === 'BAD_DATA') {\n if (logError) {\n console.error('eth call exception, return undefined', err)\n }\n return undefined\n }\n throw err\n }\n}\n;process.stdout.write(\"\");","export * from './block.js'\nexport * from './conversion.js'\nexport * as token from './token.js'\nexport * from './dex-price.js'\nexport { getPriceByType, getPriceClient, getPriceBySymbol, getCoinsThatHasPrice } from './price.js'\nexport * from './call.js'\n;process.stdout.write(\"\");"],"mappings":"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b,cAAe,GACf,aAAcE,GACd,eAAgB,GAChB,QAAS,CACP,eAAgB,CACd,UAAW,CACT,IAAI,WAAW,CACb,GACA,GACA,GACA,GACA,GACA,IACA,IACA,GACA,IACA,GACA,GACA,IACA,IACA,IACA,GACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACD,MAKT,iBAAkB,CAChB,KAAM,mBACN,YAAamB,GACb,cAAe,GACf,aAAcR,GACd,eAAgB,GAChB,QAAS,CACP,eAAgB,CACd,UAAW,CACT,IAAI,WAAW,CACb,GACA,GACA,GACA,GACA,GACA,IACA,IACA,GACA,IACA,GACA,GACA,IACA,IACA,IACA,GACA,IACA,IACA,GACA,GACA,IACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,IACA,IACA,IACD,MAKT,aAAc,CACZ,KAAM,eACN,YAAaI,GACb,cAAe,GACf,aAAcE,GACd,eAAgB,GAChB,QAAS,CACP,eAAgB,CACd,UAAW,CACT,IAAI,WAAW,CACb,GACA,GACA,GACA,GACA,GACA,IACA,IACA,GACA,IACA,GACA,GACA,IACA,IACA,IACA,GACA,IACA,IACA,GACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,GACA,EACA,GACD,QAkDb,SAASnC,GAAYsC,EAAU,CAC7B,IAAMC,EAAU,OAAO,KAAK,MAAMD,EAAK,QAAO,EAAK,GAAK,CAAC,EACnDE,EAASF,EAAK,QAAO,EAAK,IAAS,IACzC,MAAO,CAAE,QAAAC,EAAS,MAAAC,CAAK,CACzB,CAEA,SAASvC,GAAc,EAAY,CACjC,IAAIwC,GAAU,WAAW,OAAO,EAAE,QAAQ,SAAQ,CAAE,GAAK,GAAK,IAC9D,OAAAA,IAAW,EAAE,OAAS,GAAK,IACpB,IAAI,WAAW,KAAKA,CAAM,CACnC,CAEA,SAASvC,GAAkBwC,EAAM,CAC/B,OAAIA,aAAa,WAAW,KACnBA,EACE,OAAOA,GAAM,SACf,IAAI,WAAW,KAAKA,CAAC,EAErBzC,GAAcF,EAAU,SAAS2C,CAAC,CAAC,CAE9C,CAEA,SAASnB,GAASH,EAAU,CAC1B,OA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","names":["require_util","__commonJSMin","exports","value","hashMap","labels","sortedLabelNames","hash","hashObject","deltaValue","labelNames","args","acc","i","fastHashObject","keys","key","obj","Grouper","require_registry","__commonJSMin","exports","module","getValueAsString","Registry","regContentType","metrics","metric","name","escapeString","help","type","values","defaultLabels","isOpenMetrics","val","metricName","labels","sharedLabels","formattedLabels","formatLabels","flattenedShared","flattenSharedLabels","labelParts","labelsString","fullMetricLine","exemplar","formattedExemplars","promises","standardizeCounterName","resolves","defaultLabelNames","item","labelName","metricsContentType","registers","regType","reg","mergedRegistry","acc","exclude","hasOwnProperty","formatted","value","escapeLabelValue","sharedLabelCache","cached","flattened","str","require_validation","__commonJSMin","exports","util","metricRegexp","labelRegexp","name","names","savedLabels","labels","label","require_metric","__commonJSMin","exports","module","Registry","isObject","validateMetricName","validateLabelName","Metric","config","defaults","register","require_exemplar","__commonJSMin","exports","module","Exemplar","labelSet","value","res","labelName","labelValue","require_counter","__commonJSMin","exports","module","util","hashObject","isObject","getLabels","removeLabels","nowTimestamp","validateLabel","Metric","Exemplar","Counter","config","labels","value","hash","setValue","exemplarLabels","res","v","args","hashMap","require_gauge","__commonJSMin","exports","module","util","setValue","setValueDelta","getLabels","hashObject","isObject","removeLabels","validateLabel","Metric","Gauge","config","labels","value","getValueArg","getLabelArg","set","setDelta","now","start","endLabels","delta","v","hash","args","gauge","require_histogram","__commonJSMin","exports","module","util","getLabels","hashObject","isObject","removeLabels","nowTimestamp","validateLabel","Metric","Exemplar","Histogram","config","label","acc","upperBound","createBaseValues","labels","value","observe","exemplarLabels","hash","bound","findBound","bucketExemplars","exemplar","data","splayLabels","v","values","extractBucketValuesForExport","addSumAndCountForExport","startTimerWithExemplar","startTimer","args","startLabels","start","endLabels","delta","startExemplarLabels","endExemplarLabels","setValuePair","metricName","sharedLabels","upperBounds","i","labelValuePair","convertLabelsAndValues","valueFromMap","b","bucketValues","result","histogram","name","bucketData","d","infLabel","bucket","newBucket","require_treebase","__commonJSMin","exports","module","TreeBase","data","res","c","iter","item","cur","cmp","i","Iterator","cb","it","tree","root","save","start","require_rbtree","__commonJSMin","exports","module","TreeBase","Node","data","dir","val","RBTree","comparator","ret","head","last","gp","ggp","p","node","is_red","dir2","single_rotate","double_rotate","cmp","found","sr","sibling","gpc","root","save","require_bintree","__commonJSMin","exports","module","TreeBase","Node","data","dir","val","BinTree","comparator","p","node","head","found","cmp","require_bintrees","__commonJSMin","exports","module","require_tdigest","__commonJSMin","exports","module","RBTree","TDigest","delta","K","CX","compare_centroid_means","everything","result","c","approx","s","a","b","compare_centroid_mean_cumns","x","n","i","exact","cumn","iter","prev","nearest","min","max","p","max_n","lower","upper","x_or_xlist","xs","ps","bound","p_or_plist","qs","h","pop_random","choices","idx","points","Digest","config","require_timeWindowQuantiles","__commonJSMin","exports","module","TDigest","TimeWindowQuantiles","maxAgeSeconds","ageBuckets","rotate","quantile","value","bucket","timeSinceLastRotateMillis","require_summary","__commonJSMin","exports","module","util","getLabels","hashObject","removeLabels","validateLabel","Metric","timeWindowQuantiles","DEFAULT_COMPRESS_COUNT","Summary","config","label","labels","value","observe","v","hashKeys","values","hashKey","s","extractSummariesForExport","getSumForExport","getCountForExport","startTimer","args","summaryOfLabels","percentiles","percentile","percentileValue","summary","startLabels","start","endLabels","delta","labelValuePair","convertLabelsAndValues","hash","summaryOfLabel","require_pushgateway","__commonJSMin","exports","module","url","http","https","gzipSync","globalRegistry","Pushgateway","gatewayUrl","options","registry","requireJobName","requestOptions","params","useGateway","method","job","groupings","gatewayUrlParsed","gatewayUrlPath","jobPath","generateGroupings","path","target","requestParams","httpModule","isHttps","resolve","reject","req","resp","body","chunk","err","metrics","key","href","require_bucketGenerators","__commonJSMin","exports","start","width","count","buckets","factor","_globalThis","init_globalThis","__esmMin","init_node","__esmMin","init_globalThis","init_platform","__esmMin","init_node","VERSION","init_version","__esmMin","_makeCompatibilityCheck","ownVersion","acceptedVersions","rejectedVersions","myVersionMatch","re","ownVersionParsed","globalVersion","_reject","v","_accept","globalVersionMatch","globalVersionParsed","isCompatible","init_semver","__esmMin","init_version","VERSION","registerGlobal","type","instance","diag","allowOverride","api","_global","GLOBAL_OPENTELEMETRY_API_KEY","_a","VERSION","err","getGlobal","globalVersion","isCompatible","_b","unregisterGlobal","major","init_global_utils","__esmMin","init_platform","init_version","init_semver","_globalThis","logProxy","funcName","namespace","args","logger","getGlobal","__spreadArray","__read","DiagComponentLogger","init_ComponentLogger","__esmMin","init_global_utils","props","_i","DiagLogLevel","init_types","__esmMin","createLogLevelDiagLogger","maxLevel","logger","DiagLogLevel","_filterFunc","funcName","theLevel","theFunc","init_logLevelLogger","__esmMin","init_types","API_NAME","DiagAPI","init_diag","__esmMin","init_ComponentLogger","init_logLevelLogger","init_types","init_global_utils","_logProxy","funcName","args","_i","logger","getGlobal","__spreadArray","__read","self","setLogger","optionsOrLogLevel","DiagLogLevel","err","_a","oldLogger","newLogger","createLogLevelDiagLogger","_b","stack","_c","registerGlobal","unregisterGlobal","options","DiagComponentLogger","BaggageImpl","init_baggage_impl","__esmMin","entries","key","entry","_a","_b","__read","k","v","newBaggage","keys","_i","keys_1","__values","keys_1_1","baggageEntryMetadataSymbol","init_symbol","__esmMin","createBaggage","entries","BaggageImpl","baggageEntryMetadataFromString","str","diag","baggageEntryMetadataSymbol","init_utils","__esmMin","init_diag","init_baggage_impl","init_symbol","DiagAPI","createContextKey","description","BaseContext","ROOT_CONTEXT","init_context","__esmMin","parentContext","self","key","value","context","consoleMap","DiagConsoleLogger","init_consoleLogger","__esmMin","_consoleFunc","funcName","args","_i","theFunc","i","createNoopMeter","NOOP_METER","NoopMeter","NoopMetric","NoopCounterMetric","NoopUpDownCounterMetric","NoopGaugeMetric","NoopHistogramMetric","NoopObservableMetric","NoopObservableCounterMetric","NoopObservableGaugeMetric","NoopObservableUpDownCounterMetric","NOOP_COUNTER_METRIC","NOOP_GAUGE_METRIC","NOOP_HISTOGRAM_METRIC","NOOP_UP_DOWN_COUNTER_METRIC","NOOP_OBSERVABLE_COUNTER_METRIC","NOOP_OBSERVABLE_GAUGE_METRIC","NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC","init_NoopMeter","__esmMin","_name","_options","_callback","_observables","_super","__extends","_value","_attributes","ValueType","init_Metric","__esmMin","defaultTextMapGetter","defaultTextMapSetter","init_TextMapPropagator","__esmMin","carrier","key","value","NoopContextManager","init_NoopContextManager","__esmMin","init_context","ROOT_CONTEXT","_context","fn","thisArg","args","_i","__spreadArray","__read","target","API_NAME","NOOP_CONTEXT_MANAGER","ContextAPI","init_context","__esmMin","init_NoopContextManager","init_global_utils","init_diag","NoopContextManager","contextManager","registerGlobal","DiagAPI","context","fn","thisArg","args","_i","_a","__spreadArray","__read","target","getGlobal","unregisterGlobal","TraceFlags","init_trace_flags","__esmMin","INVALID_SPANID","INVALID_TRACEID","INVALID_SPAN_CONTEXT","init_invalid_span_constants","__esmMin","init_trace_flags","TraceFlags","NonRecordingSpan","init_NonRecordingSpan","__esmMin","init_invalid_span_constants","_spanContext","INVALID_SPAN_CONTEXT","_key","_value","_attributes","_name","_link","_links","_status","_endTime","_exception","_time","getSpan","context","SPAN_KEY","getActiveSpan","ContextAPI","setSpan","span","deleteSpan","setSpanContext","spanContext","NonRecordingSpan","getSpanContext","_a","init_context_utils","__esmMin","init_context","init_NonRecordingSpan","createContextKey","isValidTraceId","traceId","VALID_TRACEID_REGEX","INVALID_TRACEID","isValidSpanId","spanId","VALID_SPANID_REGEX","INVALID_SPANID","isSpanContextValid","spanContext","wrapSpanContext","NonRecordingSpan","init_spancontext_utils","__esmMin","init_invalid_span_constants","init_NonRecordingSpan","isSpanContext","spanContext","contextApi","NoopTracer","init_NoopTracer","__esmMin","init_context","init_context_utils","init_NonRecordingSpan","init_spancontext_utils","ContextAPI","name","options","context","root","NonRecordingSpan","parentFromContext","getSpanContext","isSpanContextValid","arg2","arg3","arg4","opts","ctx","fn","parentContext","span","contextWithSpanSet","setSpan","NOOP_TRACER","ProxyTracer","init_ProxyTracer","__esmMin","init_NoopTracer","NoopTracer","_provider","name","version","options","context","_name","_options","_context","_fn","tracer","NoopTracerProvider","init_NoopTracerProvider","__esmMin","init_NoopTracer","_name","_version","_options","NoopTracer","NOOP_TRACER_PROVIDER","ProxyTracerProvider","init_ProxyTracerProvider","__esmMin","init_ProxyTracer","init_NoopTracerProvider","NoopTracerProvider","name","version","options","_a","ProxyTracer","delegate","SamplingDecision","init_SamplingResult","__esmMin","SpanKind","init_span_kind","__esmMin","SpanStatusCode","init_status","__esmMin","validateKey","key","VALID_KEY_REGEX","validateValue","value","VALID_VALUE_BASE_REGEX","INVALID_VALUE_COMMA_EQUAL_REGEX","VALID_KEY_CHAR_RANGE","VALID_KEY","VALID_VENDOR_KEY","init_tracestate_validators","__esmMin","MAX_TRACE_STATE_ITEMS","MAX_TRACE_STATE_LEN","LIST_MEMBERS_SEPARATOR","LIST_MEMBER_KEY_VALUE_SPLITTER","TraceStateImpl","init_tracestate_impl","__esmMin","init_tracestate_validators","rawTraceState","key","value","traceState","_this","agg","part","listMember","i","validateKey","validateValue","createTraceState","rawTraceState","TraceStateImpl","init_utils","__esmMin","init_tracestate_impl","context","init_context_api","__esmMin","init_context","ContextAPI","diag","init_diag_api","__esmMin","init_diag","DiagAPI","NoopMeterProvider","NOOP_METER_PROVIDER","init_NoopMeterProvider","__esmMin","init_NoopMeter","_name","_version","_options","NOOP_METER","API_NAME","MetricsAPI","init_metrics","__esmMin","init_NoopMeterProvider","init_global_utils","init_diag","provider","registerGlobal","DiagAPI","getGlobal","NOOP_METER_PROVIDER","name","version","options","unregisterGlobal","metrics","init_metrics_api","__esmMin","init_metrics","MetricsAPI","NoopTextMapPropagator","init_NoopTextMapPropagator","__esmMin","_context","_carrier","context","getBaggage","context","BAGGAGE_KEY","getActiveBaggage","ContextAPI","setBaggage","baggage","deleteBaggage","init_context_helpers","__esmMin","init_context","createContextKey","API_NAME","NOOP_TEXT_MAP_PROPAGATOR","PropagationAPI","init_propagation","__esmMin","init_global_utils","init_NoopTextMapPropagator","init_TextMapPropagator","init_context_helpers","init_utils","init_diag","NoopTextMapPropagator","createBaggage","getBaggage","getActiveBaggage","setBaggage","deleteBaggage","propagator","registerGlobal","DiagAPI","context","carrier","setter","defaultTextMapSetter","getter","defaultTextMapGetter","unregisterGlobal","getGlobal","propagation","init_propagation_api","__esmMin","init_propagation","PropagationAPI","API_NAME","TraceAPI","init_trace","__esmMin","init_global_utils","init_ProxyTracerProvider","init_spancontext_utils","init_context_utils","init_diag","ProxyTracerProvider","wrapSpanContext","isSpanContextValid","deleteSpan","getSpan","getActiveSpan","getSpanContext","setSpan","setSpanContext","provider","success","registerGlobal","DiagAPI","getGlobal","name","version","unregisterGlobal","trace","init_trace_api","__esmMin","init_trace","TraceAPI","esm_exports","__export","DiagConsoleLogger","DiagLogLevel","INVALID_SPANID","INVALID_SPAN_CONTEXT","INVALID_TRACEID","ProxyTracer","ProxyTracerProvider","ROOT_CONTEXT","SamplingDecision","SpanKind","SpanStatusCode","TraceFlags","ValueType","baggageEntryMetadataFromString","context","createContextKey","createNoopMeter","createTraceState","esm_default","defaultTextMapGetter","defaultTextMapSetter","diag","isSpanContextValid","isValidSpanId","isValidTraceId","metrics","propagation","trace","init_esm","__esmMin","init_utils","init_context","init_consoleLogger","init_types","init_NoopMeter","init_Metric","init_TextMapPropagator","init_ProxyTracer","init_ProxyTracerProvider","init_SamplingResult","init_span_kind","init_status","init_trace_flags","init_spancontext_utils","init_invalid_span_constants","init_context_api","init_diag_api","init_metrics_api","init_propagation_api","init_trace_api","require_processCpuTotal","__commonJSMin","exports","module","OtelApi","Counter","PROCESS_CPU_USER_SECONDS","PROCESS_CPU_SYSTEM_SECONDS","PROCESS_CPU_SECONDS","registry","config","registers","namePrefix","labels","exemplars","labelNames","lastCpuUsage","cpuUserUsageCounter","cpuUsage","userUsageMicros","systemUsageMicros","exemplarLabels","currentSpan","cpuSystemUsageCounter","cpuUsageCounter","require_processStartTime","__commonJSMin","exports","module","Gauge","startInSeconds","PROCESS_START_TIME","registry","config","namePrefix","labels","labelNames","require_osMemoryHeapLinux","__commonJSMin","exports","module","Gauge","fs","values","PROCESS_RESIDENT_MEMORY","PROCESS_VIRTUAL_MEMORY","PROCESS_HEAP","structureOutput","input","acc","string","value","split","registry","config","registers","namePrefix","labels","labelNames","residentMemGauge","stat","structuredOutput","virtualMemGauge","heapSizeMemGauge","require_safeMemoryUsage","__commonJSMin","exports","module","safeMemoryUsage","require_osMemoryHeap","__commonJSMin","exports","module","Gauge","linuxVariant","safeMemoryUsage","PROCESS_RESIDENT_MEMORY","notLinuxVariant","registry","config","namePrefix","labels","labelNames","memUsage","require_processOpenFileDescriptors","__commonJSMin","exports","module","Gauge","fs","process","PROCESS_OPEN_FDS","registry","config","namePrefix","labels","labelNames","fds","require_processMaxFileDescriptors","__commonJSMin","exports","module","Gauge","fs","PROCESS_MAX_FDS","maxFds","registry","config","lines","line","parts","namePrefix","labels","labelNames","require_eventLoopLag","__commonJSMin","exports","module","Gauge","perf_hooks","NODEJS_EVENTLOOP_LAG","NODEJS_EVENTLOOP_LAG_MIN","NODEJS_EVENTLOOP_LAG_MAX","NODEJS_EVENTLOOP_LAG_MEAN","NODEJS_EVENTLOOP_LAG_STDDEV","NODEJS_EVENTLOOP_LAG_P50","NODEJS_EVENTLOOP_LAG_P90","NODEJS_EVENTLOOP_LAG_P99","reportEventloopLag","start","gauge","labels","delta","seconds","registry","config","namePrefix","labelNames","registers","collect","lag","histogram","lagMin","lagMax","lagMean","lagStddev","lagP50","lagP90","lagP99","e","require_processMetricsHelpers","__commonJSMin","exports","module","aggregateByObjectName","list","data","i","listElement","updateMetrics","gauge","labels","key","require_processHandles","__commonJSMin","exports","module","aggregateByObjectName","updateMetrics","Gauge","NODEJS_ACTIVE_HANDLES","NODEJS_ACTIVE_HANDLES_TOTAL","registry","config","registers","namePrefix","labels","labelNames","handles","require_processRequests","__commonJSMin","exports","module","Gauge","aggregateByObjectName","updateMetrics","NODEJS_ACTIVE_REQUESTS","NODEJS_ACTIVE_REQUESTS_TOTAL","registry","config","namePrefix","labels","labelNames","requests","require_processResources","__commonJSMin","exports","module","Gauge","updateMetrics","NODEJS_ACTIVE_RESOURCES","NODEJS_ACTIVE_RESOURCES_TOTAL","registry","config","namePrefix","labels","labelNames","resources","data","i","resource","require_heapSizeAndUsed","__commonJSMin","exports","module","Gauge","safeMemoryUsage","NODEJS_HEAP_SIZE_TOTAL","NODEJS_HEAP_SIZE_USED","NODEJS_EXTERNAL_MEMORY","registry","config","labels","labelNames","registers","namePrefix","collect","memUsage","heapSizeTotal","heapSizeUsed","externalMemUsed","require_heapSpacesSizeAndUsed","__commonJSMin","exports","module","Gauge","v8","METRICS","NODEJS_HEAP_SIZE","metricType","registry","config","e","registers","namePrefix","labels","labelNames","gauges","space","spaceName","require_version","__commonJSMin","exports","module","Gauge","version","versionSegments","NODE_VERSION_INFO","registry","config","namePrefix","labels","labelNames","require_gc","__commonJSMin","exports","module","Histogram","perf_hooks","NODEJS_GC_DURATION_SECONDS","DEFAULT_GC_DURATION_BUCKETS","kinds","registry","config","namePrefix","labels","labelNames","buckets","gcHistogram","list","entry","kind","require_defaultMetrics","__commonJSMin","exports","module","isObject","processCpuTotal","processStartTime","osMemoryHeap","processOpenFileDescriptors","processMaxFileDescriptors","eventLoopLag","processHandles","processRequests","processResources","heapSizeAndUsed","heapSpacesSizeAndUsed","version","gc","metrics","metricsList","config","metric","require_metricAggregators","__commonJSMin","exports","Grouper","hashObject","AggregatorFactory","aggregatorFn","metrics","result","byLabels","metric","value","key","values","valObj","v","p","c","require_cluster","__commonJSMin","exports","module","Registry","Grouper","aggregators","cluster","data","GET_METRICS_REQ","GET_METRICS_RES","registries","requestCtr","listenersAdded","requests","AggregatorRegistry","regContentType","addListeners","requestId","resolve","reject","settled","done","err","result","request","message","id","metricsArr","registryType","aggregatedRegistry","metricsByName","metrics","metric","aggregatorName","aggregatorFn","aggregatedMetric","aggregatedMetricWrapper","regs","reg","worker","registry","promString","r","error","require_prom_client","__commonJSMin","exports","value","prom_client_1","exports","prom_client_1","exports","getLabels","method","callType","path","serviceName","methodName","incrementStreamMessagesCounter","iterable","counter","item","abort_controller_x_1","nice_grpc_common_1","prom_client_1","common_1","registry_1","defaultStartedMetric","defaultHandledMetric","defaultStreamMsgReceivedMetric","defaultStreamMsgSentMetric","defaultHandlingSecondsMetric","prometheusServerMiddleware","options","serverStartedMetric","serverHandledMetric","serverStreamMsgReceivedMetric","serverStreamMsgSentMetric","serverHandlingSecondsMetric","call","context","labels","stopTimer","settled","status","request","response","err","exports","abort_controller_x_1","nice_grpc_common_1","prom_client_1","common_1","registry_1","defaultClientStartedMetric","defaultClientHandledMetric","defaultClientStreamMsgReceivedMetric","defaultClientStreamMsgSentMetric","defaultClientHandlingSecondsMetric","prometheusClientMiddleware","options","clientStartedMetric","clientHandledMetric","clientStreamMsgReceivedMetric","clientStreamMsgSentMetric","clientHandlingSecondsMetric","call","labels","stopTimer","settled","status","request","response","err","exports","registry_1","exports","server_1","client_1","common_1","abort_controller_x_1","nice_grpc_common_1","defaultRetryableStatuses","retryMiddleware","call","options","idempotencyLevel","isIdempotent","retry","retryBaseDelayMs","retryMaxDelayMs","retryMaxAttempts","onRetryableError","retryableStatuses","restOptions","signal","_a","attempt","error","backoff","delayMs","exports","getBlockSafely","provider","blockNumber","block","estimateBlockNumberAtDate","targetDate","startBlock","targetTimestamp","latestBlock","low","high","mid","midBlock","bytesToBigInt","bytes","intValue","i","token_exports","__export","NATIVE_ETH","getER20NormalizedAmount","getERC20TokenInfo","perf","warned","PROCESS","emitWarning","msg","type","code","fn","AC","AS","_","warnACPolyfill","reason","printACPolyfillWarning","shouldWarn","TYPE","isPosInt","n","getUintArray","max","ZeroArray","size","_constructing","_Stack","HeapCls","__privateSet","s","__privateGet","Stack","__privateAdd","LRUCache","#max","#maxSize","#dispose","#disposeAfter","#fetchMethod","#memoMethod","#size","#calculatedSize","#keyMap","#keyList","#valList","#next","#prev","#head","#tail","#free","#disposed","#sizes","#starts","#ttls","#hasDispose","#hasFetchMethod","#hasDisposeAfter","c","p","#isBackgroundFetch","k","index","options","context","#backgroundFetch","#moveToTail","#indexes","#rindexes","#isStale","ttl","ttlResolution","ttlAutopurge","updateAgeOnGet","updateAgeOnHas","allowStale","dispose","disposeAfter","noDisposeOnSet","noUpdateTTL","maxSize","maxEntrySize","sizeCalculation","fetchMethod","memoMethod","noDeleteOnFetchRejection","noDeleteOnStaleGet","allowStaleOnFetchRejection","allowStaleOnFetchAbort","ignoreFetchAbort","UintArray","#initializeSizeTracking","#initializeTTLTracking","key","ttls","starts","#setItemTTL","start","t","#delete","#updateItemAge","#statusTTL","status","cachedNow","getNow","age","sizes","#removeItemSize","#requireSize","v","#addItemSize","#evict","_i","_s","_st","_k","_v","i","#isValidIndex","getOptions","value","thisp","deleted","entry","remain","arr","setOptions","oldVal","oldValue","dt","task","val","free","head","hasOptions","peekOptions","ac","signal","fetchOpts","cb","updateCache","aborted","ignoreAbort","fetchFail","bf","eb","er","allowStaleAborted","noDelete","pcall","res","rej","fmp","b","fetchOptions","forceRefresh","stale","isStale","staleVal","memoOptions","vv","fetching","#connect","#clear","pi","ni","NATIVE_ETH","TOKEN_INFOS","LRUCache","getTokenInfoPromise","symbol","name","decimal","getERC20TokenInfo","contextOrNetworkish","tokenAddress","chainId","BaseContext","key","res","contract","getERC20Contract","bytesContract","getERC20BytesContract","decodeBytes32String","info","getER20NormalizedAmount","amount","tokenInfo","scaleDown","fs","CsvError","code","message","options","contexts","context","key","value","is_object","obj","normalize_columns_array","columns","normalizedColumns","i","l","column","is_object","CsvError","ResizeableBuffer","size","val","length","buf","encoding","ResizeableBuffer_default","np","cr","nl","space","tab","init_state","options","ResizeableBuffer_default","delimiter","v","underscore","str","_","match","normalize_options","opts","options","opt","underscore","CsvError","value","date","normalize_columns_array","delimiter_json","delimiter","rd","isRecordEmpty","record","field","cr","nl","boms","transform","original_options","info","options","normalize_options","init_state","i","bufLen","end","encoding","escape","quote","quoting","needMoreDataSize","recordDelimiterMaxLength","numOfCharLeft","requiredLength","nextBuf","push","close","bom","comment_no_infix","from_line","ltrim","max_record_size","raw","relax_quotes","rtrim","skip_empty_lines","to","to_line","comment","record_delimiter","bomSkipped","previousBuf","rawBuffer","escapeIsQuote","buf","bomLength","pos","chr","nextChr","isNextChrTrimable","isNextChrComment","isNextChrDelimiter","isNextChrRecordDelimiter","err","CsvError","b","recordDelimiterLength","errField","errRecord","delimiterLength","lappend","rappend","columns","group_columns_by_name","from","relax_column_count","relax_column_count_less","relax_column_count_more","skip_records_with_empty_values","enabled","recordLength","finalErr","objname","obj","l","extRecord","firstLineToHeaders","headers","normalizedHeaders","normalize_columns_array","cast","wasQuoting","on_record","timchars","loop1","timchar","j","value","sourceBuf","targetBuf","targetPos","firstByte","sourceLength","delimiter","ignore_last_delimiters","del","rd","rdLength","rds","loop","msg","skip_records_with_error","isColumns","parse","data","opts","records","parser","transform","push","record","close","err1","err2","import_chain","createRequire","path","PriceUnit","getPackageRoot","pkgId","m","dir","fs","DexPrice","csvFileName","chainId","packageRoot","csvFilePath","fileContent","records","parse","record","pair","asset","target","address","blockTag","unit","oracleMap","addr","contract","getEACAggregatorProxyContract","price","decimal","scaleDown","e","EthereumDexPrice","SepoliaDexPrice","import_minimal","createBaseCoinID","CoinID","message","writer","_m0","CoinID_AddressIdentifier","input","length","reader","end","tag","object","isSet","obj","base","createBaseCoinID_AddressIdentifier","createBaseGetPriceRequest","GetPriceRequest","Timestamp","toTimestamp","fromTimestamp","fromJsonTimestamp","createBaseGetPriceResponse","GetPriceResponse","createBaseBatchGetPricesRequest","BatchGetPricesRequest","v","e","createBaseBatchGetPricesResponse","BatchGetPricesResponse","BatchGetPricesResponse_CoinPrice","createBaseBatchGetPricesResponse_CoinPrice","BatchGetPricesResponse_CoinPrice_Price","createBaseBatchGetPricesResponse_CoinPrice_Price","createBaseListCoinsRequest","ListCoinsRequest","createBaseListCoinsResponse","ListCoinsResponse","key","value","ListCoinsResponse_CoinAddressesInChainEntry","entry2","isObject","acc","entries","k","createBaseListCoinsResponse_CoinAddressesInChainEntry","createBaseCheckLatestPriceResponse","CheckLatestPriceResponse","CheckLatestPriceResponse_CoinPrice","createBaseCheckLatestPriceResponse_CoinPrice","createBaseBackfillCoinRequest","BackfillCoinRequest","createBaseBackfillCoinResponse","BackfillCoinResponse","PriceServiceDefinition","Empty","date","seconds","nanos","millis","o","import_nice_grpc","import_nice_grpc_prometheus","import_nice_grpc_client_middleware_retry","Endpoints","getPriceClient","address","Endpoints","channel","PriceServiceDefinition","priceMap","LRUCache","priceClient","getPriceByTypeOrSymbol","date","coinId","options","getPriceByTypeOrSymbolInternal","dateStr","dateString","todayDateString","key","price","res","daysDiff","tolerance","e","getPriceByType","chainId","coinType","getPriceBySymbol","symbol","getCoinsThatHasPrice","response","coin","ignoreEthCallException","promise","logError","err","SimpleEthersError"]}
|